jsf - apply request phase not being called -
i running duke guess number example , don't see life cycle executing expected. have inputtext
expects number. have converter , validator. once submit <h:form>
validator called. should check input if integer. value not getting updated on managed bean property. please explain, below code snippet.
<h:inputtext id="userno" label="user number" value="#{usernumberbean.usernumber}" convertermessage="#{errmsg.usernoconvert}" validator="#{usernumberbean.validate}"> <f:valuechangelistener type="#{usernumberbean.valuechange()}"></f:valuechangelistener> <f:validatelongrange minimum="#{usernumberbean.minimum}" maximum="#{usernumberbean.maximum}" /> </h:inputtext>
here validator method set in inputtext
component. once submit <h:form>
, validate
method called, below method
public string validate(javax.faces.context.facescontext fc, javax.faces.component.uicomponent ui, java.lang.object o){ system.out.println("in own validation method"); if(usernumber ==8){ return "validation"; } return "validation"; }
here usernumber
backing bean property of class
public class usernumberbean { public integer usernumber = null; public void setusernumber(integer user_number) { system.out.println("setting username" + user_number); usernumber = user_number; } public integer getusernumber() { return usernumber; } }
it has getters , setter still usernumber
value not set. nullpointerexception
in validator method when accessing usernumber
. please let me know wrong. below code snippet
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en"> <head> <title>hello</title> </head> <%@ page contenttype="application/xhtml+xml" %> <%@ taglib uri="http://java.sun.com/jsf/html" prefix="h" %> <%@ taglib uri="http://java.sun.com/jsf/core" prefix="f" %> <body bgcolor="white"> <f:view> <h:form id="helloform" > <h2>hi. name duke. i'm thinking of number man <h:outputtext lang="en_us" value="#{usernumberbean.minimum}"/> <h:outputtext value="#{usernumberbean.maximum}"/>. can guess it?</h2> <h:graphicimage id="waveimg" url="/wave.med.gif" alt="duke waving" /> <h:inputtext id="userno" label="user number" value="#{usernumberbean.usernumber}" convertermessage="#{errmsg.usernoconvert}" validator="#{usernumberbean.validate}"> <f:valuechangelistener type="#{usernumberbean.valuechange()}"></f:valuechangelistener> <f:validatelongrange minimum="#{usernumberbean.minimum}" maximum="#{usernumberbean.maximum}" /> </h:inputtext> <h:commandbutton id="submit" action="success" value="submit" /> <p> <h:message style="color: red; font-family: 'new century schoolbook', serif; font-style: oblique; text-decoration: overline" id="errors1" for="userno"/> </p> </h:form> </f:view> </body> </html> import javax.faces.component.uicomponent; import javax.faces.context.facescontext; import javax.faces.validator.longrangevalidator; import javax.faces.validator.validator; import javax.faces.validator.validatorexception; import java.util.random; public class usernumberbean { integer randomint = null; public integer usernumber = null; string response = null; private boolean maximumset = false; private boolean minimumset = false; private long maximum = 0; private long minimum = 0; public usernumberbean() { system.out.println(" in constructor"); random randomgr = new random(); randomint = new integer(randomgr.nextint(10)); system.out.println("duke's number: " + randomint); } public void setusernumber(integer user_number) { system.out.println("setting username" + user_number); usernumber = user_number; } public integer getusernumber() { return usernumber; } public string getresponse() { system.out.println(" in getresponse"); if ((usernumber != null) && (usernumber.compareto(randomint) == 0)) { return "yay! got it!"; } else { return "sorry, " + usernumber + " incorrect."; } } public long getmaximum() { return (this.maximum); } public void setmaximum(long maximum) { this.maximum = maximum; this.maximumset = true; } public long getminimum() { return (this.minimum); } public void setminimum(long minimum) { this.minimum = minimum; this.minimumset = true; } public string validate(javax.faces.context.facescontext fc, javax.faces.component.uicomponent ui, java.lang.object o){ system.out.println("in own validation method"); if(usernumber ==8){ return "validation"; } return "validation"; } public void valuechange(){ system.out.println(" in value change"); } }
what apply request phase? happens in apply request phase? how different update model values phase
your validator broken in 2 ways:
wrong method signature. should return void. on validation faliures, should throwing
validatorexception
. on success should returning , doing nothing additional.you should validating value provided 3rd argument, not model value (which isn't been set @ point @ all).
so, should do:
public void validate(facescontext context, uicomponent component, object value) { if (value == null) { return; // ignore it. let required="true" handle. } if (value != 8) { // assuming 8 guess number? throw new validatorexception(new facesmessage("wrong guess, try again.")); } }
your nullpointerexception
caused because you're attempting compare model value usernumber
primitive integer 8
. causes autoboxing try unbox usernumber
primitive, fails if usernumber
null
cannot represented in primitive form.
as phases, apply request values phase called, validations phase otherwise never called. seem expect apply request values phase updates model values. not true, applies request parameters on jsf input component's submittedvalue
.
Comments
Post a Comment