标签: jboss-weld

JBoss Weld + java.lang.OutOfMemoryError:PermGen空间

我刚刚切换到Weld来使用CDI JSF 2 Beans +会话范围.

这是我的maven依赖:

    <dependency>
        <groupId>org.jboss.weld.servlet</groupId>
        <artifactId>weld-servlet</artifactId>
        <version>1.0.1-Final</version>
        <type>jar</type>
        <scope>compile</scope>
    </dependency>
Run Code Online (Sandbox Code Playgroud)

这是我的web.xml中的条目:

<listener>
  <listener-class>org.jboss.weld.environment.servlet.Listener</listener-class>
</listener>
Run Code Online (Sandbox Code Playgroud)

我立即注意到的一件事是我只需要重新加载我的tomcat 7 2次,java.lang.OutOfMemoryError: PermGen space并将显示在catalina.out日志文件中.

在使用Weld之前,我可以在不使用java.lang.OutOfMemoryError的情况下安全地重新加载我的tomcat 7超过10次.我认为在catalina.sh中增加我的Xmx选项会有所帮助,但这并不符合我的经验.JAVA_OPTS=-Xmx1024m

这是正常的吗?

java jsf cdi jsf-2 jboss-weld

13
推荐指数
1
解决办法
2619
查看次数

使用带有Gradle应用程序插件的weld-se时的Bean发现问题

我正在构建一个基于Gradle的Java SE应用程序,它基于Hibernate构建,是我的首选ORM.我的计划是weld-se使用CDI注释EntityManagers在整个应用程序中进行注射.

基于HibernateUtilHibernate文档中的常见帮助程序类,我转向JPA接口并添加了@Produces注释以提供生产者方法(我还添加了一个空META-INF/beans.xml):

package dao;

import javax.enterprise.inject.Disposes;
import javax.enterprise.inject.Produces;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;

public class HibernateUtil {
    private static final EntityManagerFactory emf = buildEntityManagerFactory();

    private static EntityManagerFactory buildEntityManagerFactory() {
        try {
            return Persistence.createEntityManagerFactory("persistenceUnit");
        } catch (Throwable ex) {
            System.err.println("Initial EntityManagerFactory creation failed." + ex);
            throw new ExceptionInInitializerError(ex);
        }
    }

    @Produces
    public static EntityManager createEntityManager() {
        return emf.createEntityManager();
    }

    public static void closeEntityManager(@Disposes EntityManager em) {
        System.out.println("Closing EM");
        try …
Run Code Online (Sandbox Code Playgroud)

java gradle jboss-weld weld-se

13
推荐指数
1
解决办法
4060
查看次数

Java EE 6 CDI实现之间的差异

我查看了JBoss的JSR-299上下文和依赖注入的焊接参考实现,我想知道其他CDI实现如何相互比较.具体来说,我了解Weld,Resin CanDI(由Caucho)和Apache OpenWebBeans.

resin java-ee cdi java-ee-6 jboss-weld

12
推荐指数
2
解决办法
1万
查看次数

可以在Weld中控制类路径扫描吗?

我正在玩Weld-SE(Java SE)并注意到如果类路径中有很多JAR,那么JVM启动时间会持续几秒钟.

有没有办法将扫描路径指定/限制为像Apache Ant或AspectJ中的包模式或路径模式?

PS:在Weld论坛注册只是不起作用 - 它一直说"你的密码是微不足道的"

dependency-injection cdi jboss-weld

12
推荐指数
3
解决办法
4244
查看次数

@Inject和@PersistenceContext有什么区别?

在使用JPA的项目中,我经常使用

@Inject EntityManager em;
Run Code Online (Sandbox Code Playgroud)

为了获得这样的对象.我在网上看到很多代码片段而是使用:

@PersistenceContext EntityManager em;
Run Code Online (Sandbox Code Playgroud)

这些选项有什么区别?

我的代码运行在JBoss EAP 6.1和Hibernate上.

java dependency-injection jpa jboss-weld

12
推荐指数
2
解决办法
5586
查看次数

在Tomcat中使用CDI(Weld)和简单的POJO类

经过2天的调试和尝试,除了要求您提供解决方案之外我别无其他想法.

我想在Tomcat WebApp中使用CDI(在JEE6上),只使用简单的普通旧Java对象.据我所知,可以将POJO java类注入其他POJO Java类中吗?

这是我的示例类

  • class ToBeInjected(Application-scoped/singleton)
  • class InjectingExample
  • ServletListener"ApplicationContextListener"

应用程序作用域(单例)类"ToBeInjected":

import javax.enterprise.context.ApplicationScoped;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

@ApplicationScoped
public class ToBeInjected {
  private final Logger log = LoggerFactory.getLogger(ToBeInjected.class);

  public ExampleBean() {
    log.info("ToBeInjected init");
  }

  public void sayHello() {
    log.info("Hello from ToBeInjected!");
  }

}
Run Code Online (Sandbox Code Playgroud)

类"InjectingExample"是注入上述类:

import javax.inject.Inject;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class InjectingExample {
  private final Logger log = LoggerFactory.getLogger(InjectingExample.class);

  @Inject
  private ExampleBean bean;

  public InjectionExample() {
    log.info("InjectingExample init");
  }

  public void sayHello() {
    log.info("InjectingExample …
Run Code Online (Sandbox Code Playgroud)

tomcat java-ee cdi jboss-weld

11
推荐指数
1
解决办法
2万
查看次数

在CDI焊接中查看范围

我想@ViewScoped在我的应用程序中使用- scope作为某些网页的支持bean.我还使用CDI将依赖注入到后台bean中.

但是,当我使用这样注释的支持bean时

@ManagedBean
@ViewScoped

@Inject
someDependency (...)
Run Code Online (Sandbox Code Playgroud)

@Inject注释将不注入任何东西,我得到了NullPointerException,只要我正在访问的依赖.

但是,当我装饰支持bean时

@Named
@ViewScoped


@Inject
someDependency (...)
Run Code Online (Sandbox Code Playgroud)

注射工作正常,但现在@ViewScoped被忽略,因为它不是CDI/Weld的一部分.

我如何@ViewScoped与CDI Weld一起使用?

scope cdi jboss-weld

11
推荐指数
3
解决办法
7597
查看次数

使用CDI @Inject注入Spring bean

我正在尝试将Spring上下文中定义的bean注入CDI托管组件,但我没有成功.不注入bean,而是每次执行注入时都会创建一个新实例.我的环境是使用JBoss Weld的Tomcat 7.

Spring ApplicationContext是直截了当的:

<beans>
  ...
  <bean id="testFromSpring" class="test.Test" />
  ...
</bean>
Run Code Online (Sandbox Code Playgroud)

CDI托管bean看起来像这样:

@javax.inject.Named("testA")
public class TestA {

  @javax.inject.Inject
  private Test myTest = null;

  ...

  public Test getTest() {
    return this.myTest;
  }

}
Run Code Online (Sandbox Code Playgroud)

这是我的 faces-config.xml

<faces-config xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-facesconfig_2_0.xsd" version="2.0">
  <application>
    <el-resolver>org.springframework.web.jsf.el.SpringBeanFacesELResolver</el-resolver>
  </application>
</faces-config>
Run Code Online (Sandbox Code Playgroud)

但是,当我test从JSF页面访问该属性时,Test每次访问时都会创建一个新实例.这是一个简单的例子:

<html>
  ...
  <p>1: <h:outputText value="#{testFromSpring}" /></p>
  <p>2: <h:outputText value="#{testA.test}" /></p>
  ...
Run Code Online (Sandbox Code Playgroud)

我得到以下输出:

1: test.Test@44d79c75
2: test.Test@53f336eb
Run Code Online (Sandbox Code Playgroud)

刷新后:

1: test.Test@44d79c75
2: test.Test@89f2ac63
Run Code Online (Sandbox Code Playgroud)

我可以看到第一个输出是正确的.无论我多久刷新一次页面,都会testFromSpring返回Spring上下文中定义的bean的值.但是第二个输出清楚地表明,每次调用组件getTest上的方法时test,Test …

java jsf spring cdi jboss-weld

10
推荐指数
1
解决办法
1万
查看次数

什么时候@Dependent范围的CDI bean被销毁,如果你通过Provider.get()获得那个bean?

我很难理解@DependentCDI 1.0和CDI 1.1中作用域的有效生命周期.到目前为止,我的实验得出了以下结论:

  • 一个@Dependent作用域的bean没有代理.
  • @PreDestroy@Dependentbean被销毁时,不会调用任何方法.
  • Provider.get()总是创建一个@Dependentbean 的新实例.
  • 使用JBoss 6/CDI 1.0,@Dependent@ApplicationScopedbean的Provider<>字段创建的bean 被"泄露",因为它仍然"属于" Provider.
  • 在使用WELD 2.1.2.Final/CDI 1.1时,我没有看到@Dependent类似Providers 泄漏豆类的证据(还有!).(虽然这可能是因为这些特定的 @Dependent bean是由@Produces方法创建的......!)

我看到CDI 1.1已添加了一种destroy()方法Instance<>,可能是为了解决CDI 1.0中的内存泄漏问题.但那怎么样Provider<>- CDI 1.1中是否还会泄漏?(如果确实如此,那么你应该怎么用Provider.get()?)

基本上,我有几个@ApplicationScopedbean/@SingletonEJB,我@Inject Provider试图Provider.get()用作两者的工厂@Dependent@RequestScoped"帮助"bean.我绝对希望这些bean"属于"他们的Provider字段,因为我需要将bean随后进行垃圾收集:

public void updateStuff() {
    Helper helper = …
Run Code Online (Sandbox Code Playgroud)

java-ee cdi jboss-weld weld

10
推荐指数
1
解决办法
1万
查看次数

CDI - 什么是正确的bean.xml格式?

我有一个关于bean.xml文件的正确格式和用法的问题.在我的项目中,我通常将此内容用于我的bean.xml文件(不使用explizit bean声明):

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="
      http://java.sun.com/xml/ns/javaee 
      http://java.sun.com/xml/ns/javaee/beans_1_0.xsd">
</beans>
Run Code Online (Sandbox Code Playgroud)

这在WildFly 8和9中运行良好.但是我在GlassFish 4中有部署问题.在问题:Glassfish 4,CDI中的简单示例失败,WELD-001408不满意的依赖关系我写了另一种格式:

<beans
   xmlns="http://xmlns.jcp.org/xml/ns/javaee"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee 
                  http://xmlns.jcp.org/xml/ns/javaee/beans_1_1.xsd"
          bean-discovery-mode="all">
</beans>
Run Code Online (Sandbox Code Playgroud)

使用了不同的命名空间.并且GlassFish4似乎关心这一点.

用于JEE7的空bean.xml文件的正确格式是什么?

java glassfish cdi jboss-weld

10
推荐指数
1
解决办法
1万
查看次数