Pergunta

Se o meu código lança uma exceção, às vezes - não toda - os presentes jsf uma página em branco. Estou usando facelets para layout. Um erro semelhante foram relatados em este Sun forumn's pós , mas sem respostas . Qualquer outra pessoa com o mesmo problema ou tem uma solução? ;)

Devido a alguns pedidos. Seguem-se mais datails:

web.xml

 <error-page>
        <exception-type>com.company.ApplicationResourceException</exception-type>
        <location>/error.faces</location>
 </error-page>

E a pilha relacionada com jsf é impresso após a exceção real:

####<Sep 23, 2008 5:42:55 PM GMT-03:00> <Error> <HTTP> <comp141> <AdminServer> <[ACTIVE] ExecuteThread: '3' for queue: 'weblogic.kernel.Default (self-tuning)'> <<WLS Kernel>> <> <> <1222202575662> <BEA-101107> <[weblogic.servlet.internal.WebAppServletContext@6d46b9 - appName: 'ControlPanelEAR', name: 'ControlPanelWeb', context-path: '/Web'] Problem occurred while serving the error page.
javax.servlet.ServletException: viewId:/error.xhtml - View /error.xhtml could not be restored.
    at javax.faces.webapp.FacesServlet.service(FacesServlet.java:249)
    at weblogic.servlet.internal.StubSecurityHelper$ServletServiceAction.run(StubSecurityHelper.java:226)
    at weblogic.servlet.internal.StubSecurityHelper.invokeServlet(StubSecurityHelper.java:124)
    at weblogic.servlet.internal.ServletStubImpl.execute(ServletStubImpl.java:283)
    at weblogic.servlet.internal.ServletStubImpl.execute(ServletStubImpl.java:175)
    at weblogic.servlet.internal.RequestDispatcherImpl.invokeServlet(RequestDispatcherImpl.java:525)
    at weblogic.servlet.internal.RequestDispatcherImpl.forward(RequestDispatcherImpl.java:261)
    at weblogic.servlet.internal.ForwardAction.run(ForwardAction.java:22)
    at weblogic.security.acl.internal.AuthenticatedSubject.doAs(AuthenticatedSubject.java:321)
    at weblogic.security.service.SecurityManager.runAs(Unknown Source)
    at weblogic.servlet.internal.ErrorManager.handleException(ErrorManager.java:144)
    at weblogic.servlet.internal.WebAppServletContext.handleThrowableFromInvocation(WebAppServletContext.java:2201)
    at weblogic.servlet.internal.WebAppServletContext.execute(WebAppServletContext.java:2053)
    at weblogic.servlet.internal.ServletRequestImpl.run(ServletRequestImpl.java:1366)
    at weblogic.work.ExecuteThread.execute(ExecuteThread.java:200)
    at weblogic.work.ExecuteThread.run(ExecuteThread.java:172)
javax.faces.application.ViewExpiredException: viewId:/error.xhtml - View /error.xhtml could not be restored.
    at com.sun.faces.lifecycle.RestoreViewPhase.execute(RestoreViewPhase.java:180)
    at com.sun.faces.lifecycle.LifecycleImpl.phase(LifecycleImpl.java:248)
    at com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:117)
    at javax.faces.webapp.FacesServlet.service(FacesServlet.java:244)
    at weblogic.servlet.internal.StubSecurityHelper$ServletServiceAction.run(StubSecurityHelper.java:226)
    at weblogic.servlet.internal.StubSecurityHelper.invokeServlet(StubSecurityHelper.java:124)

Eu estou usando a versão jsf Mojarra 1.2_09, richfaces 3.2.1.GA e facelets 1.1.13.

Hope alguma ajuda: (

Foi útil?

Solução

Eu acho que isso depende de sua implementação JSF. Ouvi dizer que alguns vão tornar telas em branco.

O que estávamos usando jogaria de erro 500 de um rastreamento de pilha. Outras vezes fora botões não iria funcionar sem qualquer erro para o usuário. Este foi durante a nossa fase de desenvolvimento.

Mas o melhor conselho que posso dar é para capturar as exceções e registrá-los em um log de erro para que você tenha o rastreamento de pilha para depurar mais tarde. Para mensagens que não podia fazer nada sobre como um backend não teríamos apenas adicionar uma mensagem fatal para o FacesContext que é exibida na tela e registrar o rastreamento de pilha.

Outras dicas

Eu fixo um problema semelhante em minha página error.jsp hoje. Esta não será exatamente o mesmo que o seu, mas pode apontar alguém na direcção certa, se eles estão tendo um problema semelhante. Meu problema parecia vir de duas fontes diferentes.

Em primeiro lugar, a propriedade exceção message não estava sendo definido em alguns dos servlets que estavam jogando exceções capturadas pela página de erro. Os servlets foram captura e rethrowing exceções usando o ServletException(Throwable rootCause) construtor.

Em segundo lugar, na página de erro em si, o autor original tinha código scriptlet usado para analisar a mensagem usando String.split(message, ";"); Desde que a mensagem era null este falhou. Eu estava ficando um NullPointerException no meu log de erro, juntamente com a mensagem "Problema ocorreu enquanto servia a página de erro."

Estas duas coisas combinadas para me dar uma página em branco no URL do servlet que estava jogando a exceção original. Fixei meu problema, fornecendo minha própria mensagem de erro quando eu relançar exceções em meus servlets usando o ServletException(String message, Throwable rootCause) construtor, para que a mensagem de erro já não será null. Eu também reescreveu a página error.jsp usando EL em vez de código scriptlet, mas que não era estritamente necessário.

Para uma página em branco no JSF 2, coloque um ponto de interrupção no ExceptionHandlerWrapper.handle ou uma classe substituindo este método. No meu caso, foi devido ao código personalizado que foi um demasiado restritiva e o erro não foi registado.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top