РЕДАКТИРОВАТЬ: я изменил точки инъекции CDI с использования @EJB на использование @Inject, как указано в моих комментариях ниже. Просто к сведению.
У меня есть два проекта EAR, оба в основном одинаковые. Единственная разница, которую они имеют, - это несколько специфичных для клиента реализаций, где это необходимо. У меня проблема, однако.
Вот что у меня есть:
EAR #1 содержит следующие модули:
web.war
ejb-default.jar
ejb-client-1.jar
EAR #2 содержит следующие модули:
web.war
ejb-default.jar
ejb-client-2.jar
В ejb-default содержится следующее:
@Singleton
@Startup
public class ApplicationSettingsBean implements ApplicationSettingsBeanLocal
Теперь для EAR #1 файл ejb-client-1.jar может быть пустым, поэтому любые EJB-инъекции должны использовать то, что есть в ejb-default.
Однако для EAR #2 я хочу заменить реализацию по умолчанию на конкретную для клиента. Например:
@Singleton
@Startup
@Alternative
public class ApplicationSettingsBean implements ApplicationSettingsBeanLocal {
Я также создал следующую запись beans.xml в ejb-client-2:
<beans xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/beans_1_0.xsd">
<alternatives>
<class>com.client2.ejb.ApplicationSettingsBean</class>
</alternatives>
</beans>
Я ожидаю, что реализация @Alternative будет внедрена, когда такая реализация существует. Если в точке внедрения указан @Default, то должна быть внедрена реализация по умолчанию (ejb-default). Хотя так не бывает:
// Inject the alternative implementation
@Inject
private ApplicationSettingsBeanLocal appSettingsBean;
С этим CDI вводится значение по умолчанию, а не альтернатива. Это не ожидаемое поведение.
@EJB
на@Inject
, как рекомендовал Гэвин Кинг на другом форуме, и это устранило ошибку. Однако это не решило проблему. Теперь реализация @Alternative игнорируется в пользу реализации@Default
(подразумеваемая аннотация). Я дважды проверил файл beans.xml во второй банке EJB, и он выглядит хорошо. - person John Manko   schedule 05.10.2012