【问题标题】:Does CDI offer an api for a default producer?CDI 是否为默认生产者提供 api?
【发布时间】:2012-07-01 07:26:12
【问题描述】:

我有一堆写成快速二进制 Web 服务(又名 Ejb3.1)的依赖项。这是服务声明:

@Remote
public interface MyService {...}

您可以使用以下语法将 EJB 注入 servlet 或托管 bean:

@EJB
MyService myService;

但是我不想使用@EJB 注入。我想使用普通的 CDI:

@Inject
MyService myService;

实现此目的的一种方法是为每个 EJB 创建一个 @Produces 方法:

@Produces MyService produceMyService(InjectionPoint ijp){
 //jndi lookup for MyService interface
}

但是,InjectionPoint 能够为您提供所需的所有信息,例如目标类名称(本例中为 MyService)。

在 CDI 中有没有办法做这样的事情?如果无法以任何其他方式满足所需的注入点,我想最后调用这个生产者。

@Produces Object produce(InjectionPoint ijp){
 Class ejbInterface = ijp.getType();
 //jndi lookup for ejbInterface
}

这是一个令人困惑的帖子,所以请提出澄清问题。万分感谢!

【问题讨论】:

  • 是的,确实很混乱 :) 我是否正确理解您,您正在寻找一种以“本地优先,仅在本地失败时才远程”的方式来解决依赖关系的方法?
  • 是的,那太好了。基本上是无法以任何其他方式注入的依赖项的“包罗万象”。

标签: java dependency-injection java-ee-6 guice cdi


【解决方案1】:

假设我理解您的问题(请参阅评论):不,没有用于此的 API。

好消息是有一种方法可以实现这一点 - 但您可能不想在运行时执行此操作,这是应用程序启动的一项任务。

CDI extension mechanism容器启动为您提供了一些定义明确的 bean 处理钩子。这是决定启用/禁用某些托管 bean(可能基于静态类路径信息)的逻辑的理想场所。

看看Seam Solder@Requires的功能和实现。这应该非常接近您的用例...

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-29
    • 2015-04-08
    • 1970-01-01
    • 2022-10-12
    • 2013-09-17
    • 1970-01-01
    相关资源
    最近更新 更多