Jakarta ee CDI-继承:基类型的触发器生成器
我正在尝试实施某种生产者工厂模式。Jakarta ee CDI-继承:基类型的触发器生成器,jakarta-ee,cdi,weld,Jakarta Ee,Cdi,Weld,我正在尝试实施某种生产者工厂模式。 在注入派生类型时是否可能触发基类型的生产者方法 假设以下接口: interface Service interface AService extends Service 我想触发这个制作人: @Produces Service factory() 在此注入点: @Inject AService srv; 其目的是通过添加标记接口(本例中为服务),为不同类型的服务创建一个生产者工厂 谢谢你帮助我 更新: 我尝试了LightGuards解决方案,并在AS
在注入派生类型时是否可能触发基类型的生产者方法 假设以下接口:
interface Service
interface AService extends Service
我想触发这个制作人:
@Produces
Service factory()
在此注入点:
@Inject
AService srv;
其目的是通过添加标记接口(本例中为服务),为不同类型的服务创建一个生产者工厂
谢谢你帮助我
更新: 我尝试了LightGuards解决方案,并在AService实现中添加了
@Typed
:
@Typed(Service.class)
class AServiceImplemenation implements AService
不幸的是,我得到了一个不满意的依赖项错误。CDI不会为
AService
注入点调用服务
生产者。当然,出于类型安全的原因,这是有意义的。但是,如果只有超级类型的生产者,有没有办法强制调用服务
生产者?,并使服务类型不具有无参数的构造函数(或带有@Inject
注释的构造函数),或者是@Typed
,或者在CDI 1.1中,您可以从制作者那里返回服务的任何子类。CDI不允许制作者生成超类,它不仅仅是为您的产品找到合适的制作者
@Inject
AService srv;
我面临同样的问题,我的解决方案是:
public class ServiceProxy<T> {
private final T service;
public ServiceProxy(T service) {
this.service = service;
}
public T get() {
return service;
}
}
interface AService
//something
@Produces
@SomeQualifier
ServiceProxy factory(InjectionPoint ip) {
Class<?> clazz = (Class<?>) ((ParameterizedType))ip.getType()).getActualTypeArguments()[0];
//now we know actual service class and can produce one impl
}
@Inject
@SomeQualifier
ServiceProxy<AService> srv;
公共类ServiceProxy{
私人终审法院服务;
公共服务代理(T服务){
服务=服务;
}
公共部门得不到{
回程服务;
}
}
接口服务
//某物
@产生
@某些限定词
ServiceProxy工厂(注入点ip){
Class clazz=(Class)((ParameterizedType))ip.getType()).getActualTypeArguments()[0];
//现在我们知道了实际的服务类,可以生成一个impl
}
@注入
@某些限定词
服务代理srv;
不幸的是,我得到了一个不满意的依赖项,我用@Typed(Service.class)
标记了一个服务的实现,我还为注入点和生产者提供了一个额外的限定符。但我还是有一些不满意的家属,这很奇怪。哪个服务器?这些类都在同一个war/jar中吗?我使用的是JBoss7.1.1。所有的班级都在一场战争中。另一种方法(@injectservice
和AService的生产者)也可以。我应该将键入的@放在哪里?