问题
While working with a custom component I have the problem, that UIInput#getValid() never resets itself. Question is: do I have to invoke setValid(true) myself during Apply Request Values Phase?
Here are the steps I have done:
- Create a custom component and inherit from
UIInput - The component invokes
setConverterin the constructor - The converter was designed for this component alone and throws a
ConverterExceptionif it can't convert from String to the model object - There are no validators
decode()is overriden, and ifFacesContext#isPostbackreturns true we invokesetSubmittedValuewith the request value- During render response I check
isValid(), it returns true if aConverterExceptionwas thrown, and I can render the response accordingly - But: If I submit another correct value the
setValid(true)is never called for the custom component
回答1:
The default implementation of UIInput#decode() indeed calls EditableValueHolder#setValid() with true.
So you have 2 options:
- Simply invoke
super.decode(context)in yourUIInput#decode()instead of manually grabbing submitted value and invokingsetSubmittedValue()with it (because that's already the default behavior ofUIInput#decode()). - Or, manually invoke
setValid(true)in yourUIInput#decode()before invokingsetSubimttedValue().
来源:https://stackoverflow.com/questions/63068399/is-it-necessary-to-invoke-setvalidtrue-in-decode-in-a-jsf-custom-component