我有两个罐A和B,其中A取决于B.
Jar B有一个类:
@ApplicationScoped
public class MyManagedBean {
private String user;
public MyManagedBean(){
//Constructor necesary for CDI
}
@Inject
public MyManagedBean(@Named("user") String user){
this.user = user;
}
...
}
Run Code Online (Sandbox Code Playgroud)
Jar A(更确切地说,一个EJB jar)有一个bean:
@ApplicationScoped
public class AnotherManagedBean {
public AnotherManagedBean(){
//Constructor necesary for CDI
}
@Inject
public AnotherManagedBean(MyManagedBean bean){
...
}
}
Run Code Online (Sandbox Code Playgroud)
以及带有@Produces方法的配置bean:
@ApplicationScoped
public class ConfigurationBean {
public ConfigurationBean(){
//Constructor necesary for CDI
}
@Produces
@Named("user")
public String getUser(){
return "myUser";
}
}
Run Code Online (Sandbox Code Playgroud)
但是,当我使用两个Jars部署EAR时,我遇到了这个异常:
SEVERE: Exception while loading the app …Run Code Online (Sandbox Code Playgroud) 是否可以将请求范围的CDI bean注入无状态会话bean?
我曾经问了一个相关的问题,并认为具体的CDI @RequestScoped @Stateless问题值得自己发帖.
在EJB方法/ @RequestScoped和@Stateless之间传递状态
我还问了一个关于JMS @MessageDriven bean的类似问题 - 基本上想要了解@Stateless的相同内容.
如果我可以选择,我将JBoss 7用于使用JSF 2和CDI的Java EE 6项目.
但有时候,客户项目的环境或多或少都会被设置 - 所以在一种情况下我们只限于Tomcat(6或7或7).
所以,我读了几篇关于在Tomcat中使用CDI(例如WELD)和JSF 2的文章,这表明这样做基本没问题.
不过,我的问题是 - 它有意义吗?或者servlet容器是不是这种架构的合适环境?有没有人使用Tomcat + CDI获得比演示项目更多的经验?
提前致谢!
当我使用CDI时,我可以使用@Produces注释来创建一个生成器方法,以便选择实现接口的bean将由@Inject注释注入.
现在我正在使用Spring,但我没有找到类似的东西.@Produces当我使用@Autowired注释时,我需要使用什么来获得与CDI中的注释相同的结果?
我一直在谷歌搜索几个小时在这个问题上没有评估.
关于所提供示波器的线程安全性,WELD文档和CDI规范非常明确.
例如:
适用范围 - 不安全
会话范围 - 不安全
请求范围 - 安全,始终绑定到单个线程
会话范围 - 安全(由于WELD代理序列化来自多个请求线程的访问)
我在JSF 2.x定义的View Scope上找不到任何东西.
它与对话范围大致相同,因为尽管绑定到单个视图/用户,但多个请求很可能同时命中范围.我不知道的是JSF实现是否从多个请求序列化对bean的访问.
任何人都知道规格或Morraja/MyFaces的实施可以解决这个问题吗?
我们开始尝试使用CDI实现我们的后端服务.场景是这样的:
部署EAR时启动带有@Startup的EJB.将ApplicationScoped bean注入到此:
@ApplicationScoped
public class JobPlatform {
private PooledExecutor threadHolder;
@Inject @Any
private Instance<Worker> workerSource;
...
Run Code Online (Sandbox Code Playgroud)
bean还有一个Observer方法,当观察到一个事件时,它从Instance workerSource获取一个工作bean并将它放在threadPool上,最终运行完成.
一切都很好.但是......我们已经开始看到垃圾收集问题了.JMAP堆直方图显示,这些工作人员中有许多人闲逛,没有收集垃圾.
我们认为这归结于CDI范围的结合.@Dependant的API页面(http://docs.jboss.org/cdi/api/1.0-SP1/javax/enterprise/context/Dependent.html)更清楚地强化了文档中的内容:
- 将范围@Dependent注入字段,bean构造函数或初始化方法的bean的实例是注入它的bean或Java EE组件类实例的依赖对象.
- 将@Dependent注入到producer方法中的bean的实例是正在生成的生成器方法bean实例的依赖对象.
- 通过直接调用实例获得的具有范围@Dependent的bean实例是Instance实例的依赖对象.
所以,遵循这个:
有没有人使用CDI同意这个?你是否经历过这种垃圾收集的缺乏,如果是这样,你能建议任何解决方法吗?
工作人员不能是ApplicationScoped,但平台必须是.如果我们要创建一个自定义的WorkerScope(嗯哦......)并使用它来注释每个工作类,那么这是否足以分离工作者和实例源之间的依赖关系?
还有一些建议是否有可能破坏CDI范围?我会看一下,但是想要确定范围看起来是否合理.
希望你能帮忙,谢谢.
我有点困惑,我们将CDI bean称为使用@inject注释或我们在其中使用@inject的bean注入它们的bean?
我可以(如果是这样,如何?)javax.naming.Context#lookup在EJB模块中查找CDI托管bean ?
我正在使用GlassFish v3.我想我可以使用@Named,但是什么是CDI托管bean的JNDI名称?我想从非托管POJO中查找它们,所以我无法使用@Inject.
我想做这样的事情:
@Stateless
public class GreeterEjb {
private final Greeter greeter;
@Inject
public GreeterEjb(Greeter greeter) {
this.greeter = greeter;
}
public String greet() {
return greeter.greet();
}
}
Run Code Online (Sandbox Code Playgroud)
我用Glassfish 3.1.1和JBoss 7.0.2尝试了混合结果.在某些情况下,它可以工作,在其他情况下则不然.如果您对详细信息感兴趣,请参阅Glassfisch论坛中的此主题.
在EJB 3.1规范,部分4.9.2 bean类说:
该类必须具有不带参数的公共构造函数.
这听起来像EJB不允许构造函数注入.
但CDI规范在第3节开头说,会话Bean受CDI支持.然后,第3.2节详细讨论了CDI和EJB,但从未提及有关构造函数注入不起作用的任何内容.这让我觉得它应该被允许.
那么,这些规范是否允许为EJB提供CDI构造函数注入?
我有一组通过反射实例化的类,因此这些类不由CDI容器管理,并且上下文不进行注入.我的问题是,有没有办法在CDI上下文中注册这些类,所以这些类是由上下文管理的?
贝娄,我是如何创建课程的:
String clazz = "org.myorg.thisIsMyClass";
MyClass myClass = Class.forName(clazz).newInstance(); // myClass instance not managed by CDI
Run Code Online (Sandbox Code Playgroud)
如何制作myClassCDI容器管理的实例?