我正在使用 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
这是我遇到的一个反复出现的问题,我认为 CDI 事件也许可以帮助我,但我不确定。
我有两个用户在一个网站上进行交互,我希望他们共享一个 bean 实例,这样他们就可以共享一个活动。到目前为止,我知道如何做到这一点的唯一方法是将数据推送到数据库,然后使用两个不同的 bean,每个用户一个,不断检查更改。
我的问题是,如果 sessionscoped bean 观察到一个事件,当我触发它时,每个用户的每个 sessionbean 都会得到通知吗?还是只有活动用户的会话 bean?。因为那样我就可以使用观察者来保持两个用户同步的对象。但是我真的不认为这是它的工作方式,因为如果我有一千个会话触发一个事件将导致 1000 次方法调用......
我的另一个解决方案是一个巨大的应用程序范围的 bean,它为两个用户保存活动对象,然后对它所做的任何更改都可以传达给用户,但是,我仍然必须扫描这个对象,我错过了什么吗?
我非常喜欢 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 …
我正在考虑对 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 注入的好环境……你有什么考虑?
我正在阅读 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 bean 的方式是什么?
在春天写:
@org.springframework.beans.factory.annotation.Value("${webservice.user}")
private String webserviceUser;
Run Code Online (Sandbox Code Playgroud)
是什么将webserviceUser字段设置为webservice.user属性文件/属性占位符中的属性。
如何用 CDI 做到这一点?我试图找到一些答案,但我找不到任何等价物。但是,人们写道,您可以在应用程序服务器上使用 CDI 作为 Spring 替代品,并且该用例非常基础,因此肯定有一种简单的方法,不幸的是我没有找到它。
我们正在将我们的项目迁移到针对 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) 由于@ManagedBean(eager = true)将被弃用,您如何创建一个急切的应用程序范围的 cdi bean?
我使用 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) 我想我是在问这个问题,但对于 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 字段为空。
cdi ×10
java ×5
glassfish-3 ×2
jakarta-ee ×2
jsf-2.2 ×2
decorator ×1
glassfish ×1
jboss ×1
jersey ×1
jersey-1.0 ×1
logging ×1
properties ×1
serializable ×1
session ×1
spring ×1
transient ×1