Tag: jboss weld

焊接使用src / test / META-INF / beans.xml中的替代生产者

我试图通过在src/test/resources/META-INF提供不同的beans.xml来使用Weld SE 2.3.0.Final在测试期间交换注入依赖项的替代实现 它总是似乎使用beans.xml的主要版本,我不知道为什么。 首先,这里是支持class Engine.java public interface Engine { void start(); void stop(); } DefaultEngine.java @Vetoed public class DefaultEngine implements Engine { public void start() { System.out.println(“Cough cough vrummmmm”); } public void stop() { System.out.println(“Phhhut clank”); } } Car.java public class Car { @Inject private Engine engine; public void startCar() { engine.start(); } public […]

在CDI实现项目中包含空beans.xml的目的是什么?

我在我的JSF-EJB-JPA Web应用程序中使用weld ,CDI的RI作为dependency injection组件。 我在项目中看到ejb.jar中的META-INF/beans.xml和WAR中的WEB-INF/beans.xml都有空beans.xml。 我不明白为什么我们需要在该文件中没有定义时保留空beans.xml ?

是否有可能破坏CDI范围?

我正在开发一个Java EE应用程序,主要是带有JSF管理控制台的JAX-RS,它使用CDI / Weld通过javax.enterprise.context.ApplicationScoped对象注入依赖javax.enterprise.context.ApplicationScoped 。 除了一些小的调试问题,CDI已经为这个项目做了很好的工作。 现在我需要对CDI注入的对象生命周期进行一些非常粗粒度的控制。 我需要能力: 从应用程序上下文中删除注入的对象,或 销毁/删除/清除/重置/删除整个应用程序上下文,或 定义我自己的@ScopeType并实现Context ,我可以在其中提供执行上述两个任务之一的方法。 我完全清楚,如果不是反对CDI和dependency injection的一般情况,这是相互影响的。 我只是想知道 这远程可能吗? 如果是,那么完成工作最简单/最简单/最快/最愚蠢的方法是什么?

CDI不明确的依赖关系

我有一个@SessionScoped @Named bean,它带有一个用户对象的@Producer方法: @Named @SessionScoped public class UserBean implements Serializable { //… @Named @Produces @LoggedIn @SessionScoped public MyUser getCurrentUser() {return user;} } 这在我的设置(JBoss-7.1.1-Final)中工作正常,使用#{currentUser.name}从JSF页面访问用户字段没有问题。 限定符是org.jboss.seam.security.annotations.LoggedIn 。 现在我想@Inject这个用户在另一个@Named Bean的字段中: @Named public class FavBean implements Serializable { private @Inject @LoggedIn MyUser currentUser; } 这给了我错误: org.jboss.weld.exceptions.DeploymentException: WELD-001409 Ambiguous dependencies for type [MyUser] with qualifiers [@Default] at injection point [[field] […]

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 这是正常的吗?

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

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

如何使用不同的范围注入相同类的对象?

在简单性和正确性方面,注入具有不同范围的同一类对象的最佳方法是什么? 在servlet中,我想要注入具有不同范围的同一类的对象。 还是不知道是否要使用jsf。 简单性:为每个范围制作Qualifier和制作方法太多了; 在beans.xml创建一个接口,两个类以及添加和替换也是太多了; 使用Address#isCurrent()方法没有意义。 正确性:JSR299,3.11说: 不建议使用@Named作为注入点限定符。 还是不知道为什么。 虽然在注入点使用@Named可以与@ApplicationScoped和@RequestScoped一起使用,但不能与@SessionScoped 。 请参阅下面的命名代码段 。 在spring,这很容易: spring片段 名为代码段 /* Address class */ @Produces @RequestScoped @Named(value=”request”) public Address getNewAddress(){ return new Address(); } @Produces @SessionScoped @Named(value=”application”) public Address getCurrentAddress(){ return new Address(); } /* Servlet */ @Inject @RequestScoped @Named(“request”) private Address newAddress; @Inject @ApplicationScoped @Named(“application”) private Address currentAddress;

CDI扩展 – 在ProcessAnnotatedType阶段添加拦截器

我试图以编程方式添加拦截器。 拦截器称为LogginInterceptor,只记录它运行的方法的名称。 当在方法上使用注释@Interceptors(LogginInterceptor.class)时,一切正常。 然而,我正在尝试创建CDI扩展,以编程方式将@Interceptors(LogginInterceptor)注释添加到某个类的每个方法(简单来说)。 所以,尝试一下,我用几种方法创建了Hello类。 当手动注释这些方法时,LogginInterceptor将工作并打印方法的名称。 但是,我通过CDI扩展以编程方式添加此代码的代码不起作用。 void processAnnotatedType(@Observes ProcessAnnotatedType pat) { if (pat.getAnnotatedType().getJavaClass().equals(Hello.class)) { Logger.getLogger(“”).info(“Initial annotations: ” + pat.getAnnotatedType().getAnnotations()); Map values = new HashMap(); Class[] classes = {LoggingInterceptor.class}; values.put(“value”, classes); Interceptors interceptors = AnnotationInstanceProvider.of(Interceptors.class, values); AnnotatedTypeBuilder builder = new AnnotatedTypeBuilder().readFromType(pat.getAnnotatedType()); pat.getAnnotatedType().getMethods().forEach(method -> { builder.addToMethod(method, interceptors); }); pat.setAnnotatedType(builder.create()); Logger.getLogger(“”).info(“Ending annotations: ” + pat.getAnnotatedType().getAnnotations()); } } […]

关于Wildfly 8 Final的JSF 1.2 – weld-core-jsf仍在引用JSF 2.2 API

我正在将一个JSF-1.2应用程序迁移到Wildfly 8 Final并且卡住了:( 首先,我已经阅读了许多相关问题的post(例如https://community.jboss.org/message/845006或迁移JSF 1.2 Seam应用程序到WildFly Beta 1 )但是建议的解决方案(不包括焊接子系统)没有不适合我。 我做了什么: 我按照这里的multi-jsffunction教程安装了JSF 1.2作为wildfly的模块(确切地说,3个模块)。 接下来是我为javax.faces.api和com.sun.jsf-impl(主插槽)添加了排除项,以及我的jboss-deployment-structure.xml的1.2插槽的相应依赖项。 由于该应用程序正在使用Tomahawk和Tomahawk Sandbox,我也在用我的耳朵部署,我也排除了主要插槽,并包括这两个模块的1.2插槽用于这些部署。 我的问题: 当我尝试调用部署的初始页面(login.xhthml)时,我得到以下错误,该错误是由插槽1.2中的模块“org.jboss.as.jsf-injection”引起的 ERROR [request] UT005023:对/backoffice/login.faces的exception处理请求:java.lang.NoSuchMethodError:javax.faces.context.FacesContext.getAttributes()Ljava / util / Map; [exec] at org.jboss.weld.jsf.ConversationAwareViewHandler.getActionURL(ConversationAwareViewHandler.java:103) [exec] at javax.faces.application.ViewHandlerWrapper.getActionURL(ViewHandlerWrapper.java:147) [exec] at com.sun.facelets.FaceletViewHandler.getActionURL(FaceletViewHandler.java:807) [exec] at org.apache.myfaces.shared_tomahawk.renderkit.html.HtmlRenderer.getActionUrl(HtmlRenderer.java:77) [exec] at org.apache.myfaces.custom.form.HtmlFormRenderer.getActionUrl(HtmlFormRenderer.java:45) [exec] at org.apache.myfaces.shared_tomahawk.renderkit.html.HtmlFormRendererBase.encodeBegin(HtmlFormRendererBase.java:102) [exec] at org.apache.myfaces.custom.form.HtmlFormRenderer.encodeBegin(HtmlFormRenderer.java:134) [exec] at javax.faces.component.UIComponentBase.encodeBegin(UIComponentBase.java:816) [exec] at javax.faces.component.UIComponent.encodeAll(UIComponent.java:928) [exec] at javax.faces.component.UIComponent.encodeAll(UIComponent.java:933) [exec]在com.sun.facelets.FaceletViewHandler.renderView(FaceletViewHandler.java:594) […]

命名CDI bean的默认范围是什么?

没有额外的@…Scoped注释,是否有@Named CDI bean的默认范围? 我没有在Weld官方文档中找到任何相关信息。 可以通过JSF访问@Named bean而无需额外的注释,因此可能存在一些隐式范围。 谢谢