2013-06-19 6 views
3

Я пытаюсь реализовать какой-то заводский шаблон производителя.
Возможно ли каким-либо образом инициировать метод производителя базового типа при инъекции производного типа?CDI - наследование: триггерный производитель базового типа

Предполагая, что следующие интерфейсы:

interface Service 
interface AService extends Service 

Я хочу, чтобы вызвать этот производитель:

@Produces 
Service factory() 

На данный момент впрыска:

@Inject 
AService srv; 

Цель состоит в том, чтобы иметь один производитель завод по различные виды услуг путем добавления интерфейса маркера (услуга в этом случае).

Спасибо за помощь мне


Update:

Я попытался LightGuards раствор и добавляют @Typed к реализации AService:

@Typed(Service.class) 
class AServiceImplemenation implements AService 

К сожалению, я получаю неудовлетворенные зависимости ошибка. CDI не вызывает производителя Service для точки впрыска AService. Конечно, это имеет смысл по многим причинам. Но есть ли способ заставить вызвать Service производителя?

ответ

0

Если у вас есть только производитель для супер типа, и сделать это так, чтобы тип AService не не имеет не ARGS CTOR (или один аннотированный с @Inject), или @Typed или @Vetoed в CDI 1.1 вы могли бы вернуть любой подкласс Service от вашего производителя.

+0

К сожалению, я получил _независимые зависимости_ Я отметил внедрение AService в '@Typed (Service.class)' Я также служил дополнительным определителем для точки впрыска и производителя. Но я все еще получаю неудовлетворенные зависимости. – Robotregent

+0

Это очень странно. Какой сервер? Все классы в той же войне/банке? – LightGuard

+0

Я использую jboss 7.1.1. Все классы находятся в одной войне. Другой способ ('@Inject Service' и производитель AService) отлично работает. Где именно следует помещать '@ Typed'? – Robotregent

0

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; 
Смежные вопросы