2015-05-08 27 views
0

我们有一个问题,我们有一个带注释的超类(@Resource),并且扩展该超类的子类都是无状态bean。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

你可能需要给它的所有包装成一个耳朵的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

我想如果它是一个标准的方式来查找我可能也是。尽管如此,仍然很奇怪 –