gpt4 book ai didi

java - sessionContext.getCallerPrincipal() 中的 NullPointerException

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:26:35 24 4
gpt4 key购买 nike

我有一个简单的 (webprofile) EJB 3.1 应用程序并尝试确定 @ApplicationScoped CDI Bean 中的当前用户,所以我使用:

Principal callerPrincipal = this.sessionContext.getCallerPrincipal()

工作正常(因此我可以确定当前用户的名称)。

但是在任何(其他)EJB 出现任何异常之后,此调用将不再起作用(我需要重新启动服务器)!该方法没有返回调用方主体,而是抛出此异常。

Caused by: java.lang.NullPointerException
at com.sun.ejb.containers.EJBContextImpl.getCallerPrincipal(EJBContextImpl.java:421)
at de.mytest.service.CurrentUserService.getCurrentUserId(CurrentUserService.java:102)

有人可以提示我做错了什么吗?


实现细节:

服务器 Glassfish 3.1.2

当前用户服务:

@ApplicationScoped
public class CurrentUserService {

@Resource
private SessionContext sessionContext;

public long getCurrentUserId() {

if (this.sessionContext == null) {
throw new RuntimeException("initialization error, sessionContext must not be null!");
}

/*line 102 */ Principal callerPrincipal = this.sessionContext.getCallerPrincipal();
if (callerPrincipal == null) {
throw new RuntimeException("callerPrincipal must not be null, but it is");
}

String name = callerPrincipal.getName();
if (name == null) {
throw new RuntimeException("could not determine the current user id, because no prinicial in session context");
}

return this.getUserIdForLogin(name);
}

抵制Faces Controller和CDI Service之间的EJB Facad

@Stateless
@RolesAllowed("myUser")
public class TeilnehmerServiceEjb {

@Inject
private CurrentUserService currentUserService;

public long currentUserId() {
return = currentUserService.getCurrentUserId();
}
}

网络.xml

<security-constraint>
<web-resource-collection>
<web-resource-name>All Pages</web-resource-name>
<url-pattern>/*</url-pattern>
</web-resource-collection>
<auth-constraint>
<role-name>myUser</role-name>
</auth-constraint>
</security-constraint>

<login-config>
<auth-method>BASIC</auth-method>
<realm-name>mySecurityRealm</realm-name>
</login-config>

glassfish-web.xml

<security-role-mapping>
<role-name>myUser</role-name>
<group-name>APP.MY.USER</group-name>
</security-role-mapping>

最佳答案

它不起作用的原因是因为您的 SessionContext 对象被声明为全局变量,并且由于您使用的是@ApplicationScope,因此通过 IoC 对该资源的初始化将仅在构建应用程序时完成一次。

如果您想将 bean 保留为 @ApplicationScope,我建议您在每次需要时尝试从执行操作的方法中手动访问 SessionContext,而不是手动使用 JNDI API 而不是 IoC。请参阅示例如何查看热点以执行 JNDI 查找以使用以下方法手动访问资源:

public long getCurrentUserId() {
//..
try {
InitialContext ic = new InitialContext();
SessionContext sessionContext=(SessionContext) ic.lookup("java:comp/env/sessionContext");

System.out.println("look up injected sctx: " + sessionContext);

//Now do what you want with the Session context:
Principal callerPrincipal = sessionContext.getCallerPrincipal();
//..
} catch (NamingException ex) {
throw new IllegalStateException(ex);
}
//..

}

如果您有兴趣了解更多访问 SessionContext 的方法,请查看我在其中找到该代码片段的链接:

http://javahowto.blogspot.com/2006/06/4-ways-to-get-ejbcontext-in-ejb-3.html

希望对你有帮助

关于java - sessionContext.getCallerPrincipal() 中的 NullPointerException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10581921/

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