Weird behaviour after validation errors in jsf

UI Components for JSF
Post Reply
erickmartinez
Posts: 3
Joined: 10 Jun 2011, 07:14

10 Jul 2011, 17:56

I have a form in a view which performs ajax partial processing for autocompletion and gmap localization. My backing bean instantiates an entity object "Address" and is to this object that the form's inputs are referenced:

Code: Select all

@ManagedBean(name="mybean")
@SessionScoped
public class Mybean implements Serializable {
    private Address address;
    private String fullAddress;
    private String center = "0,0";
    ....

    public mybean() {
        address = new Address();
    }
    ...
   public void handleAddressChange() {
      String c = "";
      c = (address.getAddressLine1() != null) { c += address.getAddressLine1(); }
      c = (address.getAddressLine2() != null) { c += ", " + address.getAddressLine2(); }
      c = (address.getCity() != null) { c += ", " + address.getCity(); }
      c = (address.getState() != null) { c += ", " + address.getState(); }
      fullAddress = c;
      addMessage(new FacesMessage(FacesMessage.SEVERITY_INFO, "Full Address", fullAddress));
      try {
            geocodeAddress(fullAddress);
        } catch (MalformedURLException ex) {
            Logger.getLogger(Mybean.class.getName()).log(Level.SEVERE, null, ex);
        } catch (UnsupportedEncodingException ex) {
            Logger.getLogger(Mybean.class.getName()).log(Level.SEVERE, null, ex);
        } catch (IOException ex) {
            Logger.getLogger(Mybean.class.getName()).log(Level.SEVERE, null, ex);
        } catch (ParserConfigurationException ex) {
            Logger.getLogger(Mybean.class.getName()).log(Level.SEVERE, null, ex);
        } catch (SAXException ex) {
            Logger.getLogger(Mybean.class.getName()).log(Level.SEVERE, null, ex);
        } catch (XPathExpressionException ex) {
            Logger.getLogger(Mybean.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    private void geocodeAddress(String address)
            throws MalformedURLException, UnsupportedEncodingException,
            IOException, ParserConfigurationException, SAXException,
            XPathExpressionException {

        // prepare a URL to the geocoder
        address = Normalizer.normalize(address, Normalizer.Form.NFD);
        address = address.replaceAll("[^\\p{ASCII}]", "");

        URL url = new URL(GEOCODER_REQUEST_PREFIX_FOR_XML + "?address="
                + URLEncoder.encode(address, "UTF-8") + "&sensor=false");

        // prepare an HTTP connection to the geocoder
        HttpURLConnection conn = (HttpURLConnection) url.openConnection();
        Document geocoderResultDocument = null;

        try {
            // open the connection and get results as InputSource.
            conn.connect();
            InputSource geocoderResultInputSource = new InputSource(conn.getInputStream());

            // read result and parse into XML Document
            geocoderResultDocument = DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(geocoderResultInputSource);
        } finally {
            conn.disconnect();
        }

        // prepare XPath
        XPath xpath = XPathFactory.newInstance().newXPath();

        // extract the result
        NodeList resultNodeList = null;

        // c) extract the coordinates of the first result
        resultNodeList = (NodeList) xpath.evaluate(
                "/GeocodeResponse/result[1]/geometry/location/*",
                geocoderResultDocument, XPathConstants.NODESET);
        String lat = "";
        String lng = "";
        for (int i = 0; i < resultNodeList.getLength(); ++i) {
            Node node = resultNodeList.item(i);
            if ("lat".equals(node.getNodeName())) {
                lat = node.getTextContent();
            }
            if ("lng".equals(node.getNodeName())) {
                lng = node.getTextContent();
            }
        }
        center = lat + "," + lng;
    }
Autocompletion and map ajax requests work fine before I process the whole form on submit. If validation fails, ajax still works ok except for the field fullAddress which is unable to update in the view, even when it's value is correctly set on the backing bean after the ajax request.

Code: Select all

                    <h:outputLabel for="address1" value="#{label.addressLine1}"/>
                    <p:inputText required="true" id="address1" value="#{mybean.address.addressLine1}">
                        <p:ajax update="latLng,fullAddress" listener="#{mybean.handleAddressChange}"
                                process="@this"/>
                    </p:inputText>
                    <p:message for="address1"/>

                    <h:outputLabel for="address2" value="#{label.addressLine2}"/>
                    <p:inputText id="address2" value="#{mybean.address.addressLine2}"
                                 label="#{label.addressLine2}">
                        <f:validateBean disabled="#{true}" />
                        <p:ajax update="latLng,fullAddress" listener="#{mybean.handleAddressChange}"
                                process="address1,@this"/>
                    </p:inputText>
                    <p:message for="address2"/>

                    <h:outputLabel for="city" value="#{label.city}"/>
                    <p:inputText required="true" id="city" value="#{mybean.address.city}"
                                 label="#{label.city}">
                        <p:ajax update="latLng,fullAddress" listener="#{mybean.handleAddressChange}"
                                process="address1,address2,@this"/>
                    </p:inputText>
                    <p:message for="city"/>

                    <h:outputLabel for="state" value="#{label.state}"/>
                    <p:autoComplete id="state" value="#{mybean.address.state}"
                                    completeMethod="#{mybean.completeState}"
                                    selectListener="#{mybean.handleStateSelect}"
                                    onSelectUpdate="latLng,fullAddress,growl"
                                    required="true">
                        <p:ajax process="address1,address2,city,@this"/>
                    </p:autoComplete>
                    <p:message for="state"/> 
                    <h:outputLabel for="fullAddress" value="#{label.fullAddress}"/>
                    <p:inputText id="fullAddress" value="#{mybean.fullAddress}" 
                                 style="width: 300px;"
                                 label="#{label.fullAddress}"/>
                     <p:commandButton value="#{label.locate}" process="@this,fullAddress" update="growl,latLng"
                                  actionListener="#{mybean.findOnMap}" id="findOnMap"/>

                     <p:gmap id="latLng" center="#{mybean.center}" zoom="18" type="ROADMAP" 
                            style="width:600px;height:400px;margin-bottom: 10px;"
                            model="#{mybean.mapModel}"
                            onPointClick="handlePointClick(event);"
                            pointSelectListener="#{mybean.onPointSelect}"
                            onPointSelectUpdate="growl"
                            draggable="true"
                            markerDragListener="#{mybean.onMarkerDrag}"
                            onMarkerDragUpdate="growl"
                            widgetVar="map"/>
                    <p:commandButton id="register" value="#{label.register}" action="#{mybean.register}" ajax="false"/>
If I refresh the page, validation error messages disappear and the ajax completes fullAddress field as expected.

Another weird behavior occurs also during validation: I have disabled bean validation for a form field, as seen on the code. This work alright until other validation errors are found, then, if I resubmit the form, jsf makes bean validation for this field!

I guess I am missing something in during the validation state but I can't figure out what's wrong with it. Does anyone knows how to debug jsf life cycle? Any ideas?

zoot
Posts: 20
Joined: 08 Nov 2010, 11:02

11 Jul 2011, 13:56

I'm sorry but are you sure your code compiles successfully?

Code: Select all

   public void handleAddressChange() {
      String c = "";
      c = (address.getAddressLine1() != null) { c += address.getAddressLine1(); }
      c = (address.getAddressLine2() != null) { c += ", " + address.getAddressLine2(); }
      c = (address.getCity() != null) { c += ", " + address.getCity(); }
      c = (address.getState() != null) { c += ", " + address.getState(); }

Post Reply

Return to “PrimeFaces”

  • Information
  • Who is online

    Users browsing this forum: No registered users and 28 guests