我正在使用Glassfish 4部署应用程序。它曾经有一个EJB,其中通过@Resource
注释将SessionContext注入其中。
@Stateless
@DeclareRoles({"StandardRole1", "StandardRole2"})
public class MyClass implements MyInterface {
@Resource
private SessionContext ctx;
@Override
public String getPrincipalName() {
return ctx.getPrincipal().getName();
}
}
这样工作正常。现在,我需要获得额外的允许角色来扩展应用程序。新角色并不总是相同的,因此将角色添加到
MyClass
bean是没有选择的。我想出的是这样的:@Stateless
@DeclareRoles({"StandardRole1", "StandardRole2"})
public class NormalRoles implements RolesInterface {
@Resource
private SessionContext ctx;
@Override
public String getPrincipalName() {
return ctx.getPrincipal().getName();
}
}
@Decorator
@DeclareRoles({"NewRole1", "NewRole2"})
public abstract NewRoles implements RolesInterface {
@Inject
@Delegate
@Default
private RolesInterface defaultBean;
@Resource
private SessionContext ctx;
@Override
public String getPrincipalName() {
return ctx.getPrincipal().getName();
}
}
@Stateless
public class MyClass implements MyInterface {
@Inject
private RolesInterface rolesBean;
@Override
public String getPrincipalName() {
return rolesBean.getPrincipalName();
}
}
现在,当我尝试运行此代码时,我从
return ctx.getPrincipal().getName();
装饰器收到了NewRoles
上的NullPointerException。问题-> SessionContext没有被注入。我在用PersistenceContext发布here之前遇到了这个问题。我试图以这种方式解决它,所以要做这样的事情:
public class Producers {
@Produces
@Resource
private SessionContext em;
}
然后在装饰器中使用
@Inject
批注而不是@Resource
。这也不起作用。有没有办法可以在装饰器中使用
@Resource
或执行类似的操作? 最佳答案
SessionContext
是链接到EJB的资源,并且Decorator不是EJB而是CDI bean,因此通常会得到一个空的SessionContext
。
您可以尝试通过Jndi获取SessionContext,如此处所述:http://javahowto.blogspot.fr/2006/06/4-ways-to-get-ejbcontext-in-ejb-3.html