【发布时间】:2015-03-05 14:13:20
【问题描述】:
我在 EJB 上有一个装饰器(所以如果我理解正确,这个装饰器就是 CDI)。我需要根据登录用户的角色做一些业务逻辑。所以在 EJB 中我有 SessionContext,但由于这是一个 EJB 对象,我需要通过 JNDI 查找它。
InitialContext ic = new InitialContext();
SessionContext ctx = (SessionContext) ic.lookup("java:comp/EJBContext");
这可行,但会产生另一个错误。当我尝试拨打 ctx.isCallerInRole("MyRole"); 时,我收到此错误:
Caused by: java.lang.IllegalStateException: Operation not allowed
at com.sun.ejb.containers.SessionContextImpl.checkAccessToCallerSecurity(SessionContextImpl.java:205)
at com.sun.ejb.containers.EJBContextImpl.isCallerInRole(EJBContextImpl.java:447)
at com.example.decorators.MyDecorator.findAll(MyDecorator.java:46)
我期望发生的是,如果登录用户处于指定角色中,则不允许 CDI 询问 SessionContext。有没有办法解决这个问题?我已经在 Google 上漫游了几天,但没有成功。
消耗
编辑:
这是我目前拥有的:
界面:
@Local
public interface StatelessSessionBeanLocal extends Serializable {
<T> Collection<T> findAll(Class<T> clazz);
boolean isCallerInRole(String role);
}
EJB:
@Stateless
public class StatelessSessionBean implements StatelessSessionBeanLocal {
@Resource
private SessionContext ctx;
@Override
public <T> Collection<T> findAll(Class<T> clazz){
...
}
@Override
public boolean isCallerInRole(String role){
return ctx.isCallerInRole(role);
}
}
装饰者:
@Decorator
public abstract class StatelessSessionBeanDecorator implements StatelessSessionBeanLocal {
@Inject
@Delegate
StatelessSessionBeanLocal sb;
@Override
public <T> Collection<T> findAll(Class<T> clazz){
if (sb.isCallerInRole("TestRole")){
return new ArrayList();
} else {
return sb.findAll(clazz);
}
}
}
这给了我一个在 StatelessSessionBean.isCallerInRole 的 NullPointerException ,指出 SessionContext 没有被注入。 (我认为是因为 SessionContext (EJB) 和 Inject (CDI) 之间的区别)注意,EJB 和 Decorator 在 EAR 中不同 JAR 中的不同包中。
【问题讨论】:
标签: java jakarta-ee glassfish ejb cdi