标签: cdi

我可以在石英调度程序作业中使用 CDI 注入吗?

我正在使用 Glassfish 和 CDI 进行注射,(大部分)成功。我似乎无法让 Quartz 作业与注入一起工作 - bean 注释为@Injectnever get injection 。

Quartz 是否使用某种不同的类加载器来阻止注入的发生?

我在 web.xml 中像这样配置 Quartz:

<context-param>
    <param-name>quartz:config-file</param-name>
    <param-value>quartz.properties</param-value>
</context-param>
<context-param>
    <param-name>quartz:shutdown-on-unload</param-name>
    <param-value>true</param-value>
</context-param>
<context-param>
    <param-name>quartz:wait-on-shutdown</param-name>
    <param-value>false</param-value>
</context-param>
<context-param>
    <param-name>quartz:start-scheduler-on-load</param-name>
    <param-value>true</param-value>
</context-param>

<listener>
    <listener-class>
        org.quartz.ee.servlet.QuartzInitializerListener
    </listener-class>
</listener>
Run Code Online (Sandbox Code Playgroud)

我的quartz.properties 看起来像:

org.quartz.scheduler.instanceName = MyScheduler
org.quartz.scheduler.instanceId = 1
org.quartz.scheduler.rmi.export = false
org.quartz.scheduler.rmi.proxy = false

org.quartz.threadPool.class=org.quartz.simpl.SimpleThreadPool
org.quartz.threadPool.threadCount = 3

org.quartz.jobStore.class = org.quartz.simpl.RAMJobStore

org.quartz.plugin.jobInitializer.class = org.quartz.plugins.xml.XMLSchedulingDataProcessorPlugin
org.quartz.plugin.jobInitializer.fileNames = quartz-config.xml
org.quartz.plugin.jobInitializer.scanInterval = 10
org.quartz.plugin.jobInitializer.wrapInUserTransaction = false
org.quartz.plugin.jobInitializer.failOnFileNotFound = true
Run Code Online (Sandbox Code Playgroud)

dependency-injection glassfish quartz-scheduler cdi glassfish-3

5
推荐指数
1
解决办法
4442
查看次数

CDI 事件,其传播范围

这是我遇到的一个反复出现的问题,我认为 CDI 事件也许可以帮助我,但我不确定。

我有两个用户在一个网站上进行交互,我希望他们共享一个 bean 实例,这样他们就可以共享一个活动。到目前为止,我知道如何做到这一点的唯一方法是将数据推送到数据库,然后使用两个不同的 bean,每个用户一个,不断检查更改。

我的问题是,如果 sessionscoped bean 观察到一个事件,当我触发它时,每个用户的每个 sessionbean 都会得到通知吗?还是只有活动用户的会话 bean?。因为那样我就可以使用观察者来保持两个用户同步的对象。但是我真的不认为这是它的工作方式,因为如果我有一千个会话触发一个事件将导致 1000 次方法调用......

我的另一个解决方案是一个巨大的应用程序范围的 bean,它为两个用户保存活动对象,然后对它所做的任何更改都可以传达给用户,但是,我仍然必须扫描这个对象,我错过了什么吗?

java session cdi

5
推荐指数
1
解决办法
2491
查看次数

CDI 构造函数注入不适用于瞬态不可序列化依赖项

我非常喜欢 CDI 的构造函数注入,但现在我发现了一个用例,其中构造函数注入显然无法按预期工作。

在我的示例中,我有两个类。类“BeanA”没有明确定义的范围,也没有实现可序列化。类“BeanB”使用@SessionScoped 进行注释并且确实实现了可序列化。

public class BeanA{
}

@SessionScoped
public class BeanB implements Serializable{
    @Inject
    private BeanA beanA;
}
Run Code Online (Sandbox Code Playgroud)

When I try to inject an instance of BeanA into BeanB of cource I get an UnserializableDependencyException from Weld because BeanA isn't serializable. This is the expected behaviour.

When I mark the field "beanA" with "transient" the injection works without problems:

@Inject
private transient BeanA beanA;
Run Code Online (Sandbox Code Playgroud)

Now Weld doesn't throw any exceptions.

This is perfectly fine for me but my …

java serializable transient constructor-injection cdi

5
推荐指数
1
解决办法
2411
查看次数

CDI注入和序列化

我正在考虑对 slf4j 记录器使用 CDI 注入,所以我创建了一个生产者。

我将它注入到一个ApplicationScoped可序列化的bean 中:

@ApplicationScoped
public final class CurrentApplicationBean implements Serializable {
    @Inject
    private transient Logger          logger;
}
Run Code Online (Sandbox Code Playgroud)

它必须是瞬态的,因为它org.slf4j.Logger是一个不扩展的接口Serializable,但这意味着必须在反序列化后重新注入记录器。

我认为 CDI 不处理这个,你有什么知识?

此外,提供者总是提供一个新Logger实例,因为它必须从 设置记录器名称InjectionPoint,这意味着RequestScopedbean 有自己的记录器实例,而不是每个类的静态记录器。

也许日志记录不是 CDI 注入的好环境……你有什么考虑?

logging code-injection cdi

5
推荐指数
1
解决办法
2056
查看次数

Java EE CDI 基于类的注入

我正在阅读 Java EE CDI,但我对基于类的资源注入的工作方式感到困惑

Java EE 6 教程给出了以下示例用法:

@Resource(name="myMessageQueue",
                type="javax.jms.ConnectionFactory")
public class SomeMessageBean {
...
}
Run Code Online (Sandbox Code Playgroud)

我知道它是如何声明的,但是声明的资源应该如何在SomeMessageBeanClass? myMessageQueue注入的资源是什么?

cdi jakarta-ee

5
推荐指数
1
解决办法
1425
查看次数

CDI 世界中@Value 的等价物是什么?

将属性值从属性占位符注入 CDI bean 的方式是什么?

在春天写:

@org.springframework.beans.factory.annotation.Value("${webservice.user}")
private String webserviceUser;
Run Code Online (Sandbox Code Playgroud)

是什么将webserviceUser字段设置为webservice.user属性文件/属性占位符中的属性。

如何用 CDI 做到这一点?我试图找到一些答案,但我找不到任何等价物。但是,人们写道,您可以在应用程序服务器上使用 CDI 作为 Spring 替代品,并且该用例非常基础,因此肯定有一种简单的方法,不幸的是我没有找到它。

java spring dependency-injection properties cdi

5
推荐指数
1
解决办法
2648
查看次数

无法像测试 JSF ViewScoped 托管 bean 那样测试 CDI ViewScoped bean

我们正在将我们的项目迁移到针对 JBoss Wildfly 的 Java EE 7。

我们有几十个@ManagedBean @javax.faces.bean.ViewScoped(旧的非 CDI ViewScoped)控制器,我们要转换成@Named @javax.faces.view.ViewScoped(新的 CDI 版本)。

我们现在在使用 Arquillian 对远程 Wildfly(每晚 beta2)服务器进行测试时遇到此异常:

org.jboss.arquillian.test.spi.ArquillianProxyException: org.jboss.weld.context.ContextNotActiveException : WELD-001303: No active contexts for scope type javax.faces.view.ViewScoped [Proxied because : Original exception not deserilizable, ClassNotFoundException]  
    at org.jboss.weld.manager.BeanManagerImpl.getContext(BeanManagerImpl.java:680)  
    at org.jboss.weld.bean.proxy.ContextBeanInstance.getInstance(ContextBeanInstance.java:79)  
    at org.jboss.weld.bean.proxy.ProxyMethodHandler.invoke(ProxyMethodHandler.java:78)  
    at controller.ViewScopedEE7Controller$Proxy$_$$_WeldClientProxy.getNumber(Unknown Source)  
    at controller.ViewScopedEE7ControllerTest.test(ViewScopedEE7ControllerTest.java:47)  
Run Code Online (Sandbox Code Playgroud)

有几件事对我来说很突出:

No active contexts for scope type javax.faces.view.ViewScoped
Run Code Online (Sandbox Code Playgroud)

[Proxied because : Original exception not deserilizable, ClassNotFoundException]  
Run Code Online (Sandbox Code Playgroud)

我有点理解第一部分,虽然这对我们使用旧的非 CDI ViewScoped 来说从来都不是问题,但我不明白第二部分,找不到什么类?或者这是一个红鲱鱼?

这是一个完整的工作示例:

ViewScopedEE7Controller.java

    package controller;  

import javax.faces.view.ViewScoped; …
Run Code Online (Sandbox Code Playgroud)

jboss cdi jboss-arquillian jsf-2.2 jakarta-ee

5
推荐指数
1
解决办法
4362
查看次数

CDI Eager Application 作用域 bean

由于@ManagedBean(eager = true)将被弃用,您如何创建一个急切的应用程序范围的 cdi bean

cdi jsf-2.2

5
推荐指数
1
解决办法
1542
查看次数

与实现不同的 jars 中的装饰器

我使用 Jboss 7.1.1 和 Weld 1.1.10。

我有一场战争,其中包括两个罐子。在 api.jar 中有接口,在 impl.jar 中有接口的实现。

api.jar:

public interface MyInterface {
    public void myMethod();
}
Run Code Online (Sandbox Code Playgroud)

实现.jar:

public class MyClass implements MyInterface {
    public void myMethod() {
        System.out.println("This is my implementation");
    }
}
Run Code Online (Sandbox Code Playgroud)

webapp.war:

public class MyRestApi {
    @Inject private MyInterface injected;

    @GET public Response doSomething() {
        injected.myMethod();
        return Response.ok().build();
    }
}
Run Code Online (Sandbox Code Playgroud)

现在我想为 MyInterface 包含一个装饰器,我将它包含在第三个 jar 中

装饰器.jar:

@Decorator public class MyDecorator implements MyInterface {
    @Inject @Delegate @Any private MyInterface delegate;

    public void myMethod() {
        System.out.println("This …
Run Code Online (Sandbox Code Playgroud)

java decorator cdi

5
推荐指数
1
解决办法
616
查看次数

我可以使用 CDI 在 Jersey 1.x 中 @Inject 一个类吗?

我想我是在问这个问题,但对于 Jersey 1.x: Dependency injection with Jersey 2.0

我正在使用 Glassfish 3、CDI 和 Jersey 1.x。我有一个@WebService正在注入这样的类:

@Inject
Foo foo;
Run Code Online (Sandbox Code Playgroud)

我已经在 中测试了@WebService它并且它有效。但是我的 Jersey 资源中的同一行代码在尝试使用foo. 我认为 Jersey 1.x 忽略了 CDI 注释。我怎样才能像在我的@WebService.

Foo 是一个 pojo,我的 web.xml 正在使用 ServletContainer:

<servlet>
    <servlet-name>JerseyServlet</servlet-name>
    <servlet-class>com.sun.jersey.spi.container.servlet.ServletContainer</servlet-class>
Run Code Online (Sandbox Code Playgroud)

我在这里找到了一些帮助。问题是我Foo @Inject自己的 bean(它们实际上是来自其中的类的 EJB @Provides)。 resourceContext.getResource(Foo.class);返回 的实例Foo,但foo@Injected 字段为空。

java jersey cdi glassfish-3 jersey-1.0

5
推荐指数
1
解决办法
2037
查看次数