Java 不允许进行装饰程序操作
我在EJB上有一个decorator,所以如果我理解正确的话,这个decorator就是CDI。我需要根据登录用户的角色执行一些业务逻辑。所以在EJB中我有SessionContext,但是因为这是一个EJB对象,所以我需要通过JNDI查找它Java 不允许进行装饰程序操作,java,jakarta-ee,glassfish,ejb,cdi,Java,Jakarta Ee,Glassfish,Ejb,Cdi,我在EJB上有一个decorator,所以如果我理解正确的话,这个decorator就是CDI。我需要根据登录用户的角色执行一些业务逻辑。所以在EJB中我有SessionContext,但是因为这是一个EJB对象,所以我需要通过JNDI查找它 InitialContext ic = new InitialContext(); SessionContext ctx = (SessionContext) ic.lookup("java:comp/EJBContext"); 这是可行的,但会产生另一
InitialContext ic = new InitialContext();
SessionContext ctx = (SessionContext) ic.lookup("java:comp/EJBContext");
这是可行的,但会产生另一个错误。当我尝试调用ctx.iscalerInrolemyrole时;我得到这个错误:
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登录用户是否处于指定角色。有办法解决这个问题吗?我已经在谷歌漫游了几天,但都没有成功
速率
编辑:
这就是我目前的情况:
接口:
@Local
public interface StatelessSessionBeanLocal extends Serializable {
<T> Collection<T> findAll(Class<T> clazz);
boolean isCallerInRole(String role);
}
EJB:
装饰师:
@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);
}
}
}
这给了我一个无状态SessionBean.isCallerInRole上的NullPointerException,指出没有注入SessionContext。我认为由于SessionContext EJB和InjectCDI Note之间的差异,EJB和Decorator在EAR中的不同jar中处于不同的包中。SessionContext是为每个bean实例创建的,使用查找方法时,您没有获得与bean实例的ctx绑定,因此不允许使用该方法。
尝试使用@Resource注入来获取bean上下文。问题是类加载器问题
ear
| - lib
| | - custom decorators.jar
| - custom ejb
| - ejb
| - war
我使用了一个producer类,该类使用@producers注释创建EntityManager和SessionContext。这个生产者类位于ejb jar中。在decorators上,我使用了ejb的一个提供的依赖项,因此在这一点上,它知道@Inject将从何而来
但一旦进入运行时,定制EJB就会找到decorator,因为它位于libs文件夹中,但decorator找不到生成的SessionContext或EntityManager
现在,我已经将装饰器移到了定制ejb中,所有的工作都很顺利。。。据我所知,@Resource是EJB,因为这个bean是一个装饰器CDI,所以它不会注入它。Result->nullpointerExceptionsContext是一个EJB规范接口,EJB是CDIBean,尝试将decorator定义为一个,如果我这样做,Netbeans会抱怨不应该用decorator或Interceptor对无状态bean进行注释。因此,当我删除Decorator注释时,Netbeans抱怨委托注释不应该在无状态bean中。所以当我这么做的时候,装潢师的全部目的就消失了。还是我看错了?在那里定义@Stateless your bean impl和injext SessionContext,然后定义一个方法委托给ctx.isCallerInRole。在您的decorator中,使用InjectDelegate Any MyBean MyBean注入与bean相关的实例,并调用委派的methodOk,因此我现在有了一个方法-boolean isCallerRoleString角色;在接口中公开,由bean和装饰器实现。只有bean重写它,如果调用者是角色,则请求具有@Resource注释的SessionContext。现在,NPE在decorator中消失了,但出现在bean本身的isCallerOnRestring角色方法中。
ear
| - lib
| | - custom decorators.jar
| - custom ejb
| - ejb
| - war