Tag: cdi

受限制的CDIgenerics

JSR-299规范在§3.1中说明: 如果托管bean类是generics类型,则它必须具有范围@Dependent。 如果具有参数化bean类的托管bean声明除@Dependent之外的任何作用域,则容器会自动检测问题并将其视为定义错误。 有效地意味着你不能这样做: @Named @SessionScoped or @RequestScoped or similar public class MyProducer {…} 这个决定的技术原因是什么? 它是否会在即将发布的CDI版本中得到补救? 是否有处理/解决此问题的最佳做法? 谢谢 编辑 – 我经常使用的解决方法是将通用POJO-bean注入到具有所需范围的bean中。 通常,但并非总是如此。

从线程调用bean时,范围类型javax.enterprise.context.RequestScoped没有活动的上下文

使用Weld-SE 2.1.2.Final获取bean并从线程调用它时,我遇到以下exception: 线程“main”中的exceptionorg.jboss.weld.context.ContextNotActiveException:WELD-001303:范围类型javax.enterprise.context.RequestScoped没有活动上下文 我的bean用@RequestScooped注释。 如果我注释@ApplicationScoped然后它工作正常,但我需要保留@RequestScooped。 这是一个复制者: public static void main(String[] args) throws Exception { Weld weld = new Weld(); WeldContainer container = weld.initialize(); final MyPojo pojo = container.instance().select(MyPojo.class).get(); Thread t = new Thread() { public void run() { System.out.println(pojo.ping()); // This call fails } }; t.start(); t.join(); System.out.println(pojo.ping()); // This call succeed weld.shutdown(); } @RequestScoped […]

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

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

@Inject仅适用于CDI容器创建的POJO?

我只想确认我完全理解CDI工作的先决条件。 如果我有Aclass: public class A { @Inject private B b; } 现在,当我使用以下方法实例化此类时: A a = new A(); 在这种情况下,Ab将为null。 但是如果我在另一个类中定义一个成员: @Inject A a; 以后使用a,ab会被正确填充吗? CDI仅在需要注射的类也由CDI容器创建时才起作用吗? 或者,如果使用普通实例化创建POJO时,注射结果为null,我会错过什么(是的,我有beans.xml)?

无法在自定义Apache Shiro AuthorizingRealm中@Inject我的DAO

我正在尝试将我的UserDAO注入Apache Shiro正在使用的自定义AuthorizingRealm中,但是……我得到了null。 我究竟做错了什么? shiro.ini [main] user = demo.shiro.security.FacesAjaxAwareUserFilter realmA = demo.shiro.security.JpaRealm credentialsMatcher = org.apache.shiro.authc.credential.SimpleCredentialsMatcher realmA.credentialsMatcher = $credentialsMatcher securityManager.realms = $realmA user.loginUrl = /pages/public/login.xhtml [users] admin = admin user = user [urls] # public files and folders /index.html = anon /resources/** = anon /pages/public/** = anon # restricted files and folders /pages/admin/** = user /pages/user/** = […]

在CDI SessionScoped bean中注入HttpServletRequest

我有一个会话范围的CDI bean,我需要以某种方式访问​​这个bean的@PostConstruct方法中的HttpServletRequest对象。 可能吗? 我试过注入这样一个对象,但结果是: WELD-001408 Unsatisfied dependencies for type [HttpServletRequest] with qualifiers [@Default] at injection point [[field] @Inject …] 正如我在google搜索中所理解的那样,Seam框架具有这样的function,但我在GlassFish服务器上有一个标准的Java EE应用程序。 是否有可能以某种方式将请求传递给CDI bean的@PostConstruct方法?

可以在JSR 330中使@Inject成为可选项(如@Autowire(required = false)吗?

Spring的@Autowire可以配置为如果找不到匹配的autowire候选者,Spring不会抛出错误: @Autowire(required=false) 是否有等效的JSR-330注释? 如果没有匹配的候选者,@ @Inject总是会失败。 有没有什么方法可以使用@Inject但如果没有找到匹配的类型,框架是否会失败? 我找不到那种程度的文件。

JEE6 @ApplicationScoped bean和并发

我需要编写一个bean来充当访问它的次数的计数器。 我正在考虑将@ApplicationScoped bean与AtomicInteger一起使用 @ApplicationScoped class VisitsCounter { private AtomicInteger counter; @PostConstruct public void construct() { counter = new AtomicInteger(0); } public int visited() { return counter.incrementAndGet(); } } 我的问题是:在同时考虑多个请求时可以吗? 或者我需要使用@ConcurrencyManagement和@Lock注释吗? 我想Atomic*应该可以做到,但我不确定。 当我将线程安全集合作为字段时,同样适用吗? 比如说我有 @ApplicationScoped class ValuesHolder { private List values; @PostConstruct public void construct() { values = Collections.synchronizedList(new LinkedList()); } public void insert(String value) { […]

我可以(以及如何)使用EJB模块中的javax.naming.Context#lookup查找CDI托管bean吗?

我可以(如果是这样,如何?)在EJB模块中使用javax.naming.Context#lookup查找CDI托管bean? 我正在使用GlassFish v3。 我想我可以使用@Named ,但是什么是CDI托管bean的JNDI名称? 我想从非托管POJO中查找它们,所以我不能使用@Inject 。

Action类可以限定为Singleton吗?

我的问题不仅仅是动作类可以限定为单例,而且我还想知道哪些是最佳实践。 两者都在Struts2和Spring的背景下。 控制器和型号的最佳VIEW范围(例如请求或会话)。