Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ssh/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Jakarta ee CDI-继承:基类型的触发器生成器_Jakarta Ee_Cdi_Weld - Fatal编程技术网

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的生产者)也可以。我应该将键入的
@放在哪里?