tengo una sencilla (webprofile) EJB 3.1 Aplicación y tratar de no determinar que el usuario actual dentro de una @ApplicationScoped
CDI Bean, así que utilizo:NullPointerException en sessionContext.getCallerPrincipal()
Principal callerPrincipal = this.sessionContext.getCallerPrincipal()
que funciona bien (por lo que puede determinar el nombre del usuario actual).
Pero después de cualquier excepción en cualquier (otro) EJB, esta invocación ya no funciona (¡tengo que reiniciar el servidor)! En lugar de devolver el principal llamante, el método arroja esta excepción.
Caused by: java.lang.NullPointerException
at com.sun.ejb.containers.EJBContextImpl.getCallerPrincipal(EJBContextImpl.java:421)
at de.mytest.service.CurrentUserService.getCurrentUserId(CurrentUserService.java:102)
¿Alguien me puede dar una pista de lo que estoy haciendo mal?
Detalles de la implementación:
servidor Glassfish 3.1.2
CurrentUserService:
@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);
}
El EJB Facad que resisten entre el controlador caras y el Servicio de CDI
@Stateless
@RolesAllowed("myUser")
public class TeilnehmerServiceEjb {
@Inject
private CurrentUserService currentUserService;
public long currentUserId() {
return = currentUserService.getCurrentUserId();
}
}
Web.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>
¿Por qué no hacer que SessionScoped? –
Esto se parece a un defecto de Glassfish. –
Si creas una aplicación que solo hace lo que describes, ¿puedes reproducir el comportamiento? Si es así, te animo a que presentes un error. – Preston