gpt4 book ai didi

java - 使用装饰器时未注入(inject) SessionContext

转载 作者:行者123 更新时间:2023-12-01 11:52:06 25 4
gpt4 key购买 nike

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

@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();
}
}

现在,当我尝试运行此程序时,我在 NewRoles 装饰器的 return ctx.getPrincipal().getName(); 上收到 NullPointerException。问题 --> SessionContext 没有被注入(inject)。

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

public class Producers {

@Produces
@Resource
private SessionContext em;
}

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

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

最佳答案

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

关于java - 使用装饰器时未注入(inject) SessionContext,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28714061/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com