我们遇到一个问题,我们有一个带有注释(@Resource
)的超类,而扩展该超类的子类是无状态bean。
与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 :(得分: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