我正在使用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

10-02 06:55