Tag: cdi

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

我刚刚切换到Weld来使用CDI JSF 2 Beans +会话范围。 这是我的maven依赖: org.jboss.weld.servlet weld-servlet 1.0.1-Final jar compile 这是我的web.xml中的条目: org.jboss.weld.environment.servlet.Listener 我立刻注意到的一件事是我只需要重新加载我的tomcat 7 2次,而java.lang.OutOfMemoryError: PermGen space将显示在catalina.out日志文件中。 在使用Weld之前,我可以在没有java.lang.OutOfMemoryError的情况下安全地重新加载我的tomcat 7超过10次。 我认为在catalina.sh中增加我的Xmx选项会有所帮助,但这并不符合我的经验。 JAVA_OPTS=-Xmx1024m 这是正常的吗?

何时应该使用Instance 和Provider 在CDI中注入bean?

我一直在阅读Instance和Provider的API文档,但是它们何时应该被使用还不是很清楚。 以下方法有什么区别? @Inject MyBean bean; @Inject Instance bean; @Inject Provider bean;

当打包为EAR时,是否可以在WAR内观察CDI事件

我有一个包含多个后端模块(EJB)的企业应用程序归档(EAR)以及一些Web模块(WAR)。 事件在其中一个后端模块中被触发: @Inject private Event myEvent; … public void fireEvent() { myEvent.fire(new MyEvent()); } … 可以在任何其他后端模块中观察到这样的代码: public void listener(@Observes MyEvent myEvent) { .. } 但是我无法在WAR中检索事件。 这是因为类加载器可见性(来自WAR的类对EJB不可见)还是CDI应该处理这个问题? 如果CDI不能用于应用程序范围的事件,有哪些替代方案? JMS 番石榴EventBus … 有什么与CDI有效吗? 也许某些CDI扩展将事件连接到WAR? ———–编辑: 如果它在同一个WAR中被触发,我能够观察到该事件。 此外,我尝试使用@Stateless bean作为事件侦听器,但没有成功。 包装是这样的: 耳 WAR(应在此处观察事件) 战争 EJB(事件在这里被触发)

如何在CDI中动态创建实例

我们假设我有一个Car类。 在我的代码中,我想创建10辆汽车。 Car类有一些@Inject注释依赖项。 这样做的最佳方法是什么? CDI有一个Provider接口,我可以使用它来创建汽车: @Inject Provider carProvider; public void businessMethod(){ Car car = carProvider.get(); } 不幸的是,如果我没有CarFactory,它有一个带有@Produces注释的方法来创建汽车,那就不行了。 尽管它反映了现实世界我无法在没有工厂的情况下制造汽车,但我宁愿不为所有东西编写工厂。 我只是希望CDI容器像任何其他bean一样创建我的汽车。 你怎么建议我创造那些汽车?

CDI具有非托管对象

假设我有两个类,首先是一个没有任何属性,字段或注释的类: public class B {} 和一个注入B的类,如下所示: public class A { @Inject private B b; public B getB() { return b; } } 现在A类在我们使用它之前是没用的,所以有两个选择: @Inject它 使用可靠的“new A()”手动构造它 如果A被注入,CDI管理它并且足够注入B,其具有隐含的@Dependent范围。 很酷,就是我想要的。 但是,如果我手动构造A(假设在工厂或构建器中),CDI完全忽略我的对象并且不会注入类型B的对象。 示例我在谈论它什么时候不起作用,这里对象a将始终保持为null: public class Builder { @Inject private A a; public static Builder ofTypeSomething() { // do some magic here return new Builder(); } private Builder() { […]

以单例模式使用CDI

我正在尝试在一个按照单例方法实现的类中注入一个logger对象。 代码几乎看起来像这样: Logger类: public class LoggerFactory { @Produces public Logger getLogger(InjectionPoint caller){ return Logger.getLogger(caller.getMember().getDeclaringClass().getName()); } } 然后我创建一个需要logger并实现Singleton模式的类: public class MySingleton{ @Inject private Logger logger; private MySingleton instance; /* * Private constructor for singleton implementation */ private MySingleton(){ logger.info(“Creating one and only one instance here!”); } public MySingleton getInstance(){ if(instance == null) { instance = new […]

在CDI中更大范围的bean实例中注入更短范围的Bean实例 – 它是如何工作的?

考虑以下请求范围的CDI bean: @RequestScoped public class RequestScopedBean { // … } 现在,我将它注入应用程序范围的bean: @ApplicationScoped public class ApplicationScopedBean { @Inject private RequestScopedBean requestScopedBean; // … } 我运行此代码并注意到请求范围的bean实例在两个请求之间是不同的,但应用程序范围的bean实例是相同的。 我怀疑的是:这是如何运作的? 请求范围的bean实例是否在每次请求时重新分配到应用程序范围的字段? 或者应用程序范围的bean的代理只是在请求之间改变?

EJB和CDI bean序列化的最佳实践

我还没有遇到任何序列化相关的问题。 但是PMD和Findbugs发现了一系列关于序列化的潜在问题。 典型情况是注入的记录器被检测为不可序列化的。 但还有更多 – EntityManager和几个CDI bean。 我没有找到任何关于如何正确处理序列化的最佳实践。 将@Inject和@PersistenceContext注入的字段重新注入反序列化? 它们应该标记为transient吗? 或者我应该忽略/关闭代码检查? PMD建议我应该真正提供所有这些领域的访问者吗?

一场战争中有多个CDI配置文件(开发,测试版,qa,生产)?

有了使用Spring DI applicationContext.xml声明dependency injection的方法的经验,我现在试着弄清楚如何用Java EE6 CDI做同样的事情。 使用Spring,我可以将我的.jar与几个配置文件一起发送,例如unittest.xml,devel.xml,qa.xml,production.xml ,并使用命令行参数或环境变量激活它们。 使用CDI,我可以在beans.xml中使用@Alternative和web.xml中的属性,但似乎没有办法为不同的环境提供多个beans.xml。 我不想使用Maven配置文件/filter来生成我的应用程序的4-6版本,虽然我知道在某些情况下这将是更好的解决方案(即向客户发送准备好的构建战争 – 但我只在内部使用我的战争所以让我们节省编译时间!) 优选地,我还能够从文件系统加载这些配置文件,以便系统管理员可以编辑它们而无需重新构建应用程序。 具有多个依赖关系和属性配置集的Java EE6方法是什么? 如果没有,那么2013年的推荐替代品是什么? 用Spring? 接缝? 吉斯? 我看到了Apache DeltaSpike的提及,但它们仍然看起来像网页上的alpha。

Weld / CDI最好的调试技巧是什么?

Java EE 6的优点之一是新的dependency injection框架 – 带有Weld参考实现的CDI – 它促使我们以一种与实现无关的方式开始内部迁移到JSR-330,明确的目标是能够拥有核心jar被冻结,然后能够添加额外的jar子,提供新的模块替换核心jar中的function。 我现在正在与Weld一起完成上述工作,并且坦率地说,封面背后有太多的魔力。 无论是有效还是无效,默认情况下它不会提供很多帮助,因此您可以调查出错并修复它。 我希望有切换开关可以轻松实现以下function: 扫描了哪些类路径条目以及在哪里? 结果是什么? 什么豆可以注射哪个类? 是什么导致给定的bean以后不被考虑? 一个给定的jar子? 换句话说,我需要更详细地看待决策过程。 出于某种原因,Guice不需要这样做,也许是因为魔法少得多,也许是因为错误消息非常好。 您如何调试Weld应用程序,以及它有多大帮助?