标签: cdi

从Weld中的另一个罐子中注入一个bean

我有两个罐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)

ear jar cdi jboss-weld

18
推荐指数
1
解决办法
2万
查看次数

是否可以@Inject一个@RequestScoped bean进入@Stateless EJB?

是否可以将请求范围的CDI bean注入无状态会话bean?

我曾经问了一个相关的问题,并认为具体的CDI @RequestScoped @Stateless问题值得自己发帖.

在EJB方法/ @RequestScoped和@Stateless之间传递状态

我还问了一个关于JMS @MessageDriven bean的类似问题 - 基本上想要了解@Stateless的相同内容.

@RequestScoped将CDI注入@MessageDriven bean

stateless-session-bean java-ee cdi java-ee-6 ejb-3.1

18
推荐指数
1
解决办法
1万
查看次数

Tomcat 7上的CDI - 它有意义吗?

如果我可以选择,我将JBoss 7用于使用JSF 2和CDI的Java EE 6项目.

但有时候,客户项目的环境或多或少都会被设置 - 所以在一种情况下我们只限于Tomcat(6或7或7).

所以,我读了几篇关于在Tomcat中使用CDI(例如WELD)和JSF 2的文章,这表明这样做基本没问题.

不过,我的问题是 - 它有意义吗?或者servlet容器是不是这种架构的合适环境?有没有人使用Tomcat + CDI获得比演示项目更多的经验?

提前致谢!

tomcat cdi java-ee-6 jsf-2

18
推荐指数
1
解决办法
4909
查看次数

哪个是CDI @Produces注释的Spring等价物?

当我使用CDI时,我可以使用@Produces注释来创建一个生成器方法,以便选择实现接口的bean将由@Inject注释注入.

现在我正在使用Spring,但我没有找到类似的东西.@Produces当我使用@Autowired注释时,我需要使用什么来获得与CDI中的注释相同的结果?

java spring dependency-injection cdi

18
推荐指数
1
解决办法
9335
查看次数

JSF 2.x @ViewScoped托管bean线程是否安全?

我一直在谷歌搜索几个小时在这个问题上没有评估.

关于所提供示波器的线程安全性,WELD文档和CDI规范非常明确.

例如:

  • 适用范围 - 不安全

  • 会话范围 - 不安全

  • 请求范围 - 安全,始终绑定到单个线程

  • 会话范围 - 安全(由于WELD代理序列化来自多个请求线程的访问)

我在JSF 2.x定义的View Scope上找不到任何东西.

它与对话范围大致相同,因为尽管绑定到单个视图/用户,但多个请求很可能同时命中范围.我不知道的是JSF实现是否从多个请求序列化对bean的访问.

任何人都知道规格或Morraja/MyFaces的实施可以解决这个问题吗?

concurrency jsf cdi jsf-2 view-scope

17
推荐指数
1
解决办法
4942
查看次数

CDI应用程序和依赖范围可能合谋影响垃圾收集?

我们开始尝试使用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实例的依赖对象.

所以,遵循这个:

  • workerSource bean绑定到JobPlatform,因此具有ApplicationScoped生存期
  • 使用该实例检索的任何工作bean都绑定到它,因此具有ApplicationScoped生存期
  • 因为ApplicationScoped上下文的beanstore(我的术语知识在这里有点模糊)仍然有对​​工作bean的引用,它们不会被破坏/垃圾收集

有没有人使用CDI同意这个?你是否经历过这种垃圾收集的缺乏,如果是这样,你能建议任何解决方法吗?

工作人员不能是ApplicationScoped,但平台必须是.如果我们要创建一个自定义的WorkerScope(嗯哦......)并使用它来注释每个工作类,那么这是否足以分离工作者和实例源之间的依赖关系?

还有一些建议是否有可能破坏CDI范围?我会看一下,但是想要确定范围看起来是否合理.

希望你能帮忙,谢谢.

garbage-collection scope cdi jboss-weld

17
推荐指数
1
解决办法
4946
查看次数

什么是CDI bean?

我有点困惑,我们将CDI bean称为使用@inject注释或我们在其中使用@inject的bean注入它们的bean?

java java-ee cdi

17
推荐指数
3
解决办法
2万
查看次数

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

我可以(如果是这样,如何?)javax.naming.Context#lookup在EJB模块中查找CDI托管bean ?

我正在使用GlassFish v3.我想我可以使用@Named,但是什么是CDI托管bean的JNDI名称?我想从非托管POJO中查找它们,所以我无法使用@Inject.

java ejb glassfish cdi ejb-3.1

16
推荐指数
2
解决办法
2万
查看次数

我可以为EJB使用CDI构造函数注入吗?

我想做这样的事情:

@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构造函数注入?

java ejb cdi

16
推荐指数
2
解决办法
1万
查看次数

在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容器管理的实例?

java cdi

16
推荐指数
1
解决办法
6318
查看次数