Filters with EntityManager and loss of StatusMessages
dhinojosa Oct 14, 2009 8:31 PMI have a strange situation. I created a filter that persists an entity to the database via the EntityManager about the request and it's headers. Everything works well except the statusMessages are gone when the next page is displayed. Here is my filter:
@Startup @Scope(ScopeType.APPLICATION) @Name("requestDataCellFilter") @BypassInterceptors @Filter(within="org.jboss.seam.web.ajax4jsfFilter") public class RequestFilter extends AbstractFilter { public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { if (servletRequest instanceof HttpServletRequest) { final HttpServletRequest httpServletRequest = (HttpServletRequest) servletRequest; if ( (!(httpServletRequest.getServletPath().endsWith(".html"))) ) { filterChain.doFilter(servletRequest, servletResponse); return; } new ContextualHttpServletRequest(httpServletRequest) { @SuppressWarnings({"unchecked"}) public void process() throws ServletException { final Request request = new Request(); //Request object is an entity. request.setLocalAddr(httpServletRequest.getLocalAddr()); request.setRemoteAddr(httpServletRequest.getRemoteAddr()); request.setRemoteHost(httpServletRequest.getRemoteHost()); request.setRemotePort(httpServletRequest.getRemotePort()); request.setAuthType(httpServletRequest.getAuthType()); request.setContextPath(httpServletRequest.getContextPath()); request.setMethod(httpServletRequest.getMethod()); request.setPathInfo(httpServletRequest.getPathInfo()); request.setPathTranslated(httpServletRequest.getPathTranslated()); request.setQueryString(httpServletRequest.getQueryString()); request.setRemoteUser(httpServletRequest.getRemoteUser()); request.setRequestedSessionId(httpServletRequest.getRequestedSessionId()); request.setRequestURI(httpServletRequest.getRequestURI()); request.setRequestURL(httpServletRequest.getRequestURL().toString()); request.setServletPath(httpServletRequest.getServletPath()); Enumeration<String> enumeration = (Enumeration<String>) httpServletRequest.getHeaderNames(); while (enumeration.hasMoreElements()) { String name = enumeration.nextElement(); String value = httpServletRequest.getHeader(name); Header header = new Header(name, value); request.addHeader(header); } UserTransaction transaction = (UserTransaction) Component .getInstance("org.jboss.seam.transaction.transaction"); try { transaction.begin(); EntityManager entityManager = (EntityManager) Component.getInstance("entityManager"); Calendar calendar = (Calendar) Component.getInstance("currentCalendar"); //This is a GregorianCalendar component that I use. request.setCreatedDate(calendar); entityManager.persist(request); entityManager.flush(); transaction.commit(); } catch (Exception e) { try { transaction.rollback(); } catch (SystemException e1) { throw new ServletException(e1); } } } }.run(); } filterChain.doFilter(servletRequest, servletResponse); } }
So, for example, if someone creates an entity with EntityHome the createdMessage doesn't display because of this filter. As always, your help is appreciated.