2015-05-08 2 views
0

У нас есть проблема, когда у нас есть суперкласс с аннотацией (@Resource) и подклассы, которые расширяют этот суперкласс, являются фанатами без состояния.Аннотации по полям, которые не обрабатываются между различными развертываниями в JBoss

Очень похоже на this, если суперкласс и подкласс находятся в одном модуле, тогда ресурс успешно вводится. Если они находятся в отдельных модулях, то ресурс не вводится - кажется, аннотация не обрабатывается.

Я проверял через отражение, что аннотации «видели» на классе, но когда я ступаю в ResourceInjectionAnnotationParsingProcessor, то @Resource аннотаций не показывает на классы, которые наследуются от других модулей (хотя это показывает на классы которые находятся в одном модуле).

Общее решение, которое я видел, - это jandex файлы и набор annotations="true", но это похоже на статические модули, а не на другие развертывания, например, в нашем случае.

other suggestion было то, что модули могли отсутствовать зависимость от аннотаций, но в моем примере все задействованные модули имели зависимость от <module name="javax.annotation.api"/>.

Есть ли другой способ сделать эти аннотации «видимыми» из отдельных развертываний?

В минимальной, например, если у вас есть суперкласс

import javax.annotation.Resource; 
import javax.ejb.SessionContext; 

public class BaseResource { 
    @Resource 
    private SessionContext sessionContext; 

    public String getContext() { 
    return "Context is " + sessionContext; 
    } 
} 

и подкласс

import javax.ejb.Stateless; 

@Stateless 
public class ResourceBean extends BaseResource { 
    public ResourceBean() { 
    System.out.println(getClass().getName() + " created"); 
    } 
} 

Если они находятся в том же модуле, то SessionContext отображается. В отдельных модулях SessionContext всегда null.

+0

Вы, вероятно, нужно обернуть все это в EAR для JBoss признать суперкласса. – djb

+0

В нашем случае есть один основной проект и около 70 проектов, использующих его, поэтому его упаковка в EAR невозможна. Кроме того, JBoss распознает суперкласс, но аннотации не обрабатываются. –

+0

Подкласс @Inherited? (http://docs.oracle.com/javase/1.5.0/docs/api/java/lang/annotation/Inherited.html) – djb

ответ

0

Вы можете просто найти SessionContext в качестве обходного пути. Это не ответ на ваш вопрос, но вы можете хотя бы получить доступ к SessionContext.

public SessionContext getSessionContext() 
    { 
    try 
    { 
     InitialContext ic = new InitialContext(); 
     return (SessionContext) ic.lookup("java:comp/EJBContext"); 
    } 
    catch (NamingException ex) 
    { 
     // handle exception 
    } 
    return null; 
    } 

Отрывок из: http://javahowto.blogspot.com/2006/06/4-ways-to-get-ejbcontext-in-ejb-3.html

+0

Я полагаю, что если это стандартный способ поиска, я тоже могу. Тем не менее, странно. –

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