2013-11-11 3 views
0

похоже, что у меня отсутствует базовая концепция, но даже после часов чтения я как-то застрял прямо сейчас.CDI: получить конкретную реализацию интерфейса

дал следующие настройки: EE7 на Glassfish 4, Arquillian (псевдо) Код:

Несколько Реализации для интерфейса:

public interface Activity { 
    public void doFoo(); 
} 

@Stateless 
public class StockActivity implements Activity { 
    @Override 
    public void doFoo(){ 
     ... 
    } 
} 


@Stateless 
public class OrderActivity implements Activity { 
    @Override 
    public void doFoo(){ 
     ... 
    } 

    public void doSomeOtherStuff(){ 
     ... 
    } 
} 

Выбор в бизнес-кода, как

@Any 
@Inject 
Instance<Activity> activities; 

До сих пор все хорошо работает ... но теперь я хочу вызвать метод doSomeOtherStuff в Arquillian-Test, который не определен на интерфейсе. Я просто не могу найти способ получить экземпляр OrderActivity Bean

(я бы хотел, чтобы избежать введения «жестко заданных» спецификаторов, поскольку они будут использоваться только для тестов. Также конкретные реализации жить в своих проектах и ​​получать упакованные на одного клиента, поэтому я также не могу использовать один «enumifed» Qualifier.)

Любые идеи?

+1

Почему вы вводите операцию, если вам нужна OrderActivity? Inject OrderActivity, и вы сможете вызвать его методы. –

+0

, потому что я не могу прямо вставлять OrderActivity в данный (уже упрощенный) сценарий. – Torsten

ответ

2

хорошо, получил это сам. Для справки, вот решение:

потому что «Activity» - это единственный реализованный интерфейс (и он не является java.io.Serializable/Externalizable или из пакета javax.ejb), контейнер принимает свой единственный локальный бизнес-интерфейс. Чтобы разоблачить представление без интерфейса, bean-компоненты должны быть явно аннотированы с помощью @LocalBean

Смежные вопросы