查找所有实现接口的 EJB
Find all EJBs implementing interface
我有一组由多个提供商提供的数据。由于它们每个都有自己的访问方式,因此它们每个都有单独的 EJB,尽管它们都实现相同的接口。
有没有办法把它们都注射进去?所以我最终得到某种 List<MyInterface>
?标准注入似乎要么给出一个,要么给出歧义错误。
对于 CDI 集成,您有两种选择,具体取决于您组织项目的方式。
如果提供者是在同一个模块中定义的,即注入与 ejbs 的定义在同一个 war 中,或者在与注入点声明相同的 ejb jar 中,那么:
public class MyService {
@Inject
@Any
private Instance<MyProvider> providers;
public void notifyProviders() {
//Because there may be multiple implementation, do not use providers.get(), it is ambigous.
//The Instance object implements Iterable, so you can iterate over it using the for loop.
for(final MyProvider provider : providers) {
provider.notify();
}
}
}
但是,如果您有这些 ejb 的远程定义,那么您需要解决使用 @Producer,从那里您可以使用上述实例注入,因为 CDI 无法注入远程 ejb bean。因此:
@Stateless
public class MyProviderContext {
@EJB
private MyProvider1 provider1;
@EJB
private MyProvider2 provider2;
//... More declarations.
@Produces
public MyProvider provider1() {return provider1;}
@Produces
public MyProvider provider2() {return provider2;}
//... More producers.
}
我有一组由多个提供商提供的数据。由于它们每个都有自己的访问方式,因此它们每个都有单独的 EJB,尽管它们都实现相同的接口。
有没有办法把它们都注射进去?所以我最终得到某种 List<MyInterface>
?标准注入似乎要么给出一个,要么给出歧义错误。
对于 CDI 集成,您有两种选择,具体取决于您组织项目的方式。
如果提供者是在同一个模块中定义的,即注入与 ejbs 的定义在同一个 war 中,或者在与注入点声明相同的 ejb jar 中,那么:
public class MyService {
@Inject
@Any
private Instance<MyProvider> providers;
public void notifyProviders() {
//Because there may be multiple implementation, do not use providers.get(), it is ambigous.
//The Instance object implements Iterable, so you can iterate over it using the for loop.
for(final MyProvider provider : providers) {
provider.notify();
}
}
}
但是,如果您有这些 ejb 的远程定义,那么您需要解决使用 @Producer,从那里您可以使用上述实例注入,因为 CDI 无法注入远程 ejb bean。因此:
@Stateless
public class MyProviderContext {
@EJB
private MyProvider1 provider1;
@EJB
private MyProvider2 provider2;
//... More declarations.
@Produces
public MyProvider provider1() {return provider1;}
@Produces
public MyProvider provider2() {return provider2;}
//... More producers.
}