Access to @RequestScoped from EJB
marcial.atienzar Dec 9, 2015 10:07 AMHello,
We're using wildfly 9.0.2.Final
I've a frest service like this:
@Stateless @Path(PlaniOperations.WS_PLANILLA_ANUAL) @Produces(MediaType.TEXT_HTML) @DeclareRoles({Permisos.ROL_PUBLICO}) @RolesAllowed(value = {Permisos.ROL_PUBLICO}) @TransactionAttribute(TransactionAttributeType.NOT_SUPPORTED) public class PlanillaAnualWS { @GET @Produces(MediaType.APPLICATION_JSON) @Path(PlaniOperations.OP_SHOW_RESUMEN_BUTTON) public Boolean showResumenButton() { return bean.showResumenButton(); } }
And tthis ContainerRequestFilter:
@Provider public class KyrianSessionFilter implements ContainerRequestFilter { @Inject private KyrianRequestContext requestCtx; @Override public void filter(ContainerRequestContext requestContext) throws IOException { KyrianUser usrSession = (KyrianUser) servletRequest.getSession(). getAttribute(CommonConstant.INSTANCE_SESSION_OPERTION_HEADER); if (log.isInfoEnabled()) { log.info("ID DE SESION {} / {}", instanceSessionId, servletRequest.getRequestURI()); } if (usrSession != null) { // Añadimos a la request la información del Perfil asociado al instanceSessionId requestCtx.setUsrSession(usrSession); requestCtx.setInstanceId(instanceSessionId); } } }}
This filter, takes the KyrianUser from HttpSession, and put it on KyrianRequestContext. I need this, to access user information on EJB.
And finally, on EJB I've this code:
@Stateless @TransactionAttribute(TransactionAttributeType.NOT_SUPPORTED) @DeclareRoles({Permisos.ROL_PUBLICO}) @RolesAllowed(value = {Permisos.ROL_PUBLICO}) public class PlanillaAnualBean { @Inject private KyrianRequestContext session; @EJB private PlaniBean beanPlani; /** * Se muestra el botón de resumen si el usuario emulado tiene colaboradores * * @return */ public Boolean showResumenButton() { return beanPlani.hasColaboradores(session.getPerfilActual().getLogin()); } }
This code works well on 90% of times, sometimes I've a NPE that can't reproduce it on session.getPerfilActual().getLogin().
I'm doing something wrong, or is it a better approach to do it?