使用装饰器时不会注入SessionContext

时间:2015-02-25 08:07:16

标签: java java-ee glassfish ejb cdi

我正在使用Glassfish 4来部署应用程序。它曾经有一个EJB,其中SessionContext是通过@Resource注释注入的。

@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没有被注入。

我之前发布了here的PersistenceContext,我遇到了这个问题。我试图以这种方式解决它,所以做这样的事情:

public class Producers {

    @Produces
    @Resource
    private SessionContext em;
}

然后在装饰器中使用@Inject注释而不是@Resource。这也不起作用。

有没有办法在装饰器中使用@Resource或做类似的事情?

1 个答案:

答案 0 :(得分:1)

SessionContext是一个链接到EJB的资源,而Decorator不是EJB而是CDI bean,所以你得到一个空SessionContext是正常的。 您可以尝试通过Jndi获取SessionContext,如下所述:http://javahowto.blogspot.fr/2006/06/4-ways-to-get-ejbcontext-in-ejb-3.html