2015-12-01 3 views
1

У меня есть projectA, projectB и projectC Проекты Eclipse Maven.Weld on Java SE не использует альтернативу

  • ProjectA содержит:
    • IMyApi интерфейс.
    • "Пустой" META-INF\beans.xml файл.
  • ProjectB содержит:
    • IMyConfig интерфейс.
    • MyConfigJndi реализация IMyConfig.
    • MyApiImpl реализация IMyApi, с недвижимостью @Inject private IMyConfig config;.
    • "Пустой" META-INF\beans.xml файл.
  • ProjectC содержит:
    • MyConfigAlter реализация IMyConfig, помеченный как @Alternative.
    • a Main класс (и метод), который инициализирует Weld SE и извлекает фасоль IMyApi.
    • a META-INF\beans.xml, где MyConfigAlter указан в разделе alternatives.

Теперь я бег Main класса, и IMyApi боба успешно получен (в качестве MyApiImpl экземпляра). Но такой случай был, в его собственности config, вводили MyConfigJndi например, вместо альтернативной версии (MyConfigAlter)

Я использую Eclipse, Luna + M2Eclipse.

Что я делаю неправильно?

ОБНОВЛЕНИЕ: Я выяснил, что использование @Specializes вместо @Alternative решает проблему, но я по-прежнему считаю, что это не правильное решение (в некоторых случаях у меня может не быть доступа к реализации по умолчанию).

UPDATE 2:

Я использую Weld-се, 2.2.10.Final:

<dependency> 
    <groupId>org.jboss.weld.se</groupId> 
    <artifactId>weld-se</artifactId> 
    <version>2.2.10.Final</version> 
    <scope>runtime</scope> 
</dependency> 

И инициализация просто

WeldContainer weld = 
    new Weld(). 
    initialize(); 
IMyApi myApi = 
    weld. 
    instance(). 
    select(
     IMyApi. 
     class). 
    get(); 
+0

Не могли бы вы включить некоторую информацию, например, какую версию сваривания вы используете, как вы загружаете? Тот факт, что специализируется, звучит странно для меня. –

+0

@JohnAment Спасибо за ваш интерес, я добавил запрошенные данные. – SJuan76

+0

Из трех банок, о которых вы упомянули выше, в какой код кода инициализации живут? –

ответ

3

Выбор альтернативы с помощью alternatives элемента в дескрипторе beans.xml влияет только на соответствующий архив компонента, то есть ProjectC в вашем случае, как указано в Declaring selected alternatives for a bean archive.Исходя из этого, логично, что в бонусном архиве ProjectB вводится внедренная реализация MyConfigJndi.

Начиная с CDI 1.2, можно выбрать альтернативу по всему миру для приложения, используя аннотацию @Priority, как описано в Declaring selected alternatives for an application.

Так что в вашем случае, вы могли бы написать:

@Priority(Interceptor.Priority.Application) 
@Alternative 
class MyConfigAlter { 
} 
0

Другой способ решения этой проблемы заключается в использовании -Dorg.jboss.weld.se.archive.isolation=false - от http://docs.jboss.org/weld/reference/2.2.11.Final/en-US/html/environments.html#_bean_archive_isolation_2

Причина, по которой это происходит, что каждый JAR на пути к классам становится его собственный архив бобов. Поскольку спецификация CDI по версии 1.2 не включает спецификацию SE, нет определения того, как работает путь класса в этом режиме. Это не обязательно, как будет создано приложение SE, поскольку у вас нет уникальных загрузчиков классов для каждого JAR.