2015-06-04 1 views
0

Я пытаюсь специализировать EJB. У меня есть@Specializes for EJB

package com.foo.core; 
@Stateless 
public class MyFacade { } 

и

package com.foo.extension;  
@Specializes 
@Stateless 
public class MyFacade extends com.foo.core.MyFacade { } 

На мой взгляд, это должно работать, потому что смысл @Specializes в том, что КДИ следует забывать о колонкового класса и вместо того, чтобы использовать специализированный класс. Я также нашел эту ошибку https://issues.jboss.org/browse/WELD-1451, которая указывает, что можно специализировать EJB.

Но если я пытаюсь развернуть мое приложение (я использую Weblogic 12.1.3), я всегда получаю

weblogic.utils.ErrorCollectionException: Есть 1 вложенных ошибки: weblogic.j2ee.dd .xml.AnnotationProcessException: Дублирование имя EJB '' MyFacade найдено: аннотация 'Stateless' на класс компонента com.foo.core.MyFacade и annoation 'Безгражданство' на классе компонента com.foo.extension.MyFacade

Я делаю что-то неправильно?

Спасибо!

+0

Спецификация CDI не определяет, как работает спецификация EJB. Несмотря на то, что упомянутый вами дефект был разрешен, связанный с ним запрос на растяжение был отклонен, поэтому я не уверен, что на нем действительно исправлено. Если вы хотите специализироваться, я бы рекомендовал использовать чистые CDI. –

+0

Я решил сменить свои EJB на чистые CDI-бобы. Но мне нужно декларативное управление транзакциями. Я мог бы использовать @Transactional, но это часть JEE7 и поэтому недоступна в Weblogic 12.1.3. – Ben

+0

Как сказал JohnAment, @Specializes - это функция CDI и ее спецификация, не определяет, как работать с EJB. Я использую weblogic, и я рекомендую вам, что если вы будете ждать, когда эта ситуация будет исправлена ​​в weblogic, это может занять много времени. Итак, попробуйте найти другой подход, используя только спецификацию CDI. –

ответ

1

Сообщение об исключении, вызванное конфликтом имен, которое напрямую не связано с CDI: каждый EJB может быть адресован несколькими различными именами JNDI, а некоторые из них (например, java:module/MyFacade) включают только простое имя класса, а не имя пакета. Таким образом, вы не можете иметь два EJB с одинаковым именем в разных пакетах.

Добавление CDI и @Specializes может помешать специализированному EJB отобразиться в контейнере CDI, но он по-прежнему является EJB.

Вы можете попробовать переименовать производный класс - это должно решить проблему с дублирующимся именем, но я не уверен, что он решит вашу общую проблему.

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