Announcement Announcement Module
Collapse
No announcement yet.
ExceptionResolver and update="@all" Page Title Module
Move Remove Collapse
X
Conversation Detail Module
Collapse
  • Filter
  • Time
  • Show
Clear All
new posts

  • ExceptionResolver and update="@all"

    Hi!

    We are working on a web project using Spring Webflow 2.3.1, Mojarra 2.1.10 and PrimeFaces 3.3.1. We want to configure an ExceptionResolver that shows a generic error page for every uncaught exception thrown from our service or dialog layer.

    So we added the following lines to our webflow-config.xml

    Code:
    <bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
       <property name="defaultErrorView" value="error" />
    </bean>
    When we throw an exception in one of our service or dialog controller methods that is triggered by a button e.g.

    Code:
    <p:commandButton value="Search"	action="search" />
    The ExceptionResolver is called and we can see the error in the application log, but we do not see our error page. After some research we finally figured out, that the error page is only shown if we add an update=”@all” to the button in the Facelet page e.g.:

    Code:
    <p:commandButton value="Search"	action="search" update=”@all” />
    So we took a look at the requests that were send to the server in both scenarios. The first button (no update=all) sends a request / got a response like:


    Code:
    POST http://localhost:8090/swf-booking-faces/spring/auftragsuche?execution=e4s1 HTTP/1.1
    Host: localhost:8090
    User-Agent: Mozilla/5.0 (Windows NT 6.1; rv:13.0) Gecko/20100101 Firefox/13.0.1
    Accept: application/xml, text/xml, */*; q=0.01
    Accept-Language: de-de,de;q=0.8,en-us;q=0.5,en;q=0.3
    Accept-Encoding: gzip, deflate
    Connection: keep-alive
    Content-Type: application/x-www-form-urlencoded; charset=UTF-8
    Faces-Request: partial/ajax
    X-Requested-With: XMLHttpRequest
    Referer: http://localhost:8090/swf-booking-faces/spring/auftragsuche?execution=e4s1
    Content-Length: 200
    Cookie: JSESSIONID=0B4A40285E65A3D02FE8428E1B7769B1
    Pragma: no-cache
    Cache-Control: no-cache
    
    javax.faces.partial.ajax=true&javax.faces.source=j_idt17%3Asearch&javax.faces.partial.execute=%40all&j_idt17%3Asearch=j_idt17%3Asearch&j_idt17=j_idt17&j_idt17%3AorderNumber=&javax.faces.ViewState=e4s1
    
    
    
    HTTP/1.1 200 OK
    Server: Apache-Coyote/1.1
    Pragma: no-cache
    Expires: Thu, 01 Jan 1970 00:00:00 GMT
    Cache-Control: no-cache
    Cache-Control: no-store
    X-Powered-By: JSF/2.0
    X-Powered-By: JSF/2.0
    Cache-Control: no-cache
    Content-Type: text/xml;charset=UTF-8
    Content-Language: de-DE
    Content-Length: 76
    Date: Thu, 22 Nov 2012 19:10:25 GMT
    
    <?xml version='1.0' encoding='UTF-8'?>
    <partial-response></partial-response>
    As you see the response in empty! The second button sends a request / got a response like:

    Code:
    POST http://localhost:8090/swf-booking-faces/spring/auftragsuche?execution=e3s1 HTTP/1.1
    Host: localhost:8090
    User-Agent: Mozilla/5.0 (Windows NT 6.1; rv:13.0) Gecko/20100101 Firefox/13.0.1
    Accept: application/xml, text/xml, */*; q=0.01
    Accept-Language: de-de,de;q=0.8,en-us;q=0.5,en;q=0.3
    Accept-Encoding: gzip, deflate
    Connection: keep-alive
    Content-Type: application/x-www-form-urlencoded; charset=UTF-8
    Faces-Request: partial/ajax
    X-Requested-With: XMLHttpRequest
    Referer: http://localhost:8090/swf-booking-faces/spring/auftragsuche?execution=e3s1
    Content-Length: 234
    Cookie: JSESSIONID=0B4A40285E65A3D02FE8428E1B7769B1
    Pragma: no-cache
    Cache-Control: no-cache
    
    javax.faces.partial.ajax=true&javax.faces.source=j_idt17%3Asearch&javax.faces.partial.execute=%40all&javax.faces.partial.render=%40all&j_idt17%3Asearch=j_idt17%3Asearch&j_idt17=j_idt17&j_idt17%3AorderNumber=&javax.faces.ViewState=e3s1
    
    
    HTTP/1.1 200 OK
    Server: Apache-Coyote/1.1
    Pragma: no-cache
    Expires: Thu, 01 Jan 1970 00:00:00 GMT
    Cache-Control: no-cache
    Cache-Control: no-store
    X-Powered-By: JSF/2.0
    X-Powered-By: JSF/2.0
    Cache-Control: no-cache
    Content-Type: text/xml;charset=UTF-8
    Content-Language: de-DE
    Content-Length: 964
    Date: Thu, 22 Nov 2012 19:08:25 GMT
    
    <?xml version='1.0' encoding='UTF-8'?>
    <partial-response><changes><update id="javax.faces.ViewRoot"><![CDATA[<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml"><head><link type="text/css" rel="stylesheet" href="/swf-booking-faces/spring/javax.faces.resource/theme.css?ln=primefaces-aristo" />
    		<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
    		<title>Fehler</title></head><body>Error!<br /></body>
    </html>]]></update></changes></partial-response>
    As you can see, the response contains the error page. Both requests are Ajax requests and are absolutely identical except one little detail: the working request got a javax.faces.partial.render=%40all as additional parameter.

    Update=@all causes JSF to update the complete form after an ajax request. That is usually not! what we want. In most scenarios Ajax request shall update only a part particular part of the page. Otherwise it makes no sense to use Ajax at all. As consequence the ExceptionResolver do not work in most of our scenarios.

    Questions:
    1) Is this a Problem of Spring WebFlow or a problem Mojarra or PrimeFaces?
    2) Assuming that the problem is caused by Spring Webflow, why does Spring WebFlow shows the described behavior?
    3) Is this a bug or a feature?
    4) If not a bug what can we do to make the ExceptionResolver working for Ajax request without update=@all?


    Any help is highly appreciated!

    Regards

    Jar-Runner
Working...
X