Is it necessary to invoke setValid(true) in decode() in a JSF Custom Component?

Viewed 82

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 setConverter in the constructor
  • The converter was designed for this component alone and throws a ConverterException if it can't convert from String to the model object
  • There are no validators
  • decode() is overriden, and if FacesContext#isPostback returns true we invoke setSubmittedValue with the request value
  • During render response I check isValid(), it returns true if a ConverterException was 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 Answers

The default implementation of UIInput#decode() indeed calls EditableValueHolder#setValid() with true.

So you have 2 options:

  • Simply invoke super.decode(context) in your UIInput#decode() instead of manually grabbing submitted value and invoking setSubmittedValue() with it (because that's already the default behavior of UIInput#decode()).
  • Or, manually invoke setValid(true) in your UIInput#decode() before invoking setSubimttedValue().
Related