我刚刚切换到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
这是正常的吗?
我正在构建一个基于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) 我查看了JBoss的JSR-299上下文和依赖注入的焊接参考实现,我想知道其他CDI实现如何相互比较.具体来说,我了解Weld,Resin CanDI(由Caucho)和Apache OpenWebBeans.
我正在玩Weld-SE(Java SE)并注意到如果类路径中有很多JAR,那么JVM启动时间会持续几秒钟.
有没有办法将扫描路径指定/限制为像Apache Ant或AspectJ中的包模式或路径模式?
PS:在Weld论坛注册只是不起作用 - 它一直说"你的密码是微不足道的"
在使用JPA的项目中,我经常使用
@Inject EntityManager em;
Run Code Online (Sandbox Code Playgroud)
为了获得这样的对象.我在网上看到很多代码片段而是使用:
@PersistenceContext EntityManager em;
Run Code Online (Sandbox Code Playgroud)
这些选项有什么区别?
我的代码运行在JBoss EAP 6.1和Hibernate上.
经过2天的调试和尝试,除了要求您提供解决方案之外我别无其他想法.
我想在Tomcat WebApp中使用CDI(在JEE6上),只使用简单的普通旧Java对象.据我所知,可以将POJO java类注入其他POJO Java类中吗?
这是我的示例类
应用程序作用域(单例)类"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) 我想@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一起使用?
我正在尝试将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 …
我很难理解@DependentCDI 1.0和CDI 1.1中作用域的有效生命周期.到目前为止,我的实验得出了以下结论:
@Dependent作用域的bean没有代理.@PreDestroy当@Dependentbean被销毁时,不会调用任何方法.Provider.get()总是创建一个@Dependentbean 的新实例.@Dependent由@ApplicationScopedbean的Provider<>字段创建的bean 被"泄露",因为它仍然"属于" Provider.@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) 我有一个关于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文件的正确格式是什么?