Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/394.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 不允许进行装饰程序操作_Java_Jakarta Ee_Glassfish_Ejb_Cdi - Fatal编程技术网

Java 不允许进行装饰程序操作

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"); 这是可行的,但会产生另一

我在EJB上有一个decorator,所以如果我理解正确的话,这个decorator就是CDI。我需要根据登录用户的角色执行一些业务逻辑。所以在EJB中我有SessionContext,但是因为这是一个EJB对象,所以我需要通过JNDI查找它

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