h: inputText que é obrigado a propriedade String é submeter cadeia vazia em vez de null
Pergunta
Tenho uma aplicação JSF 2.0 no Tomcat com muitos campos <h:inputText>
para entrada de dados no meu banco de dados. Alguns campos não são necessários.
<h:inputText value="#{registerBean.user.phoneNumber}" id="phoneNumber">
<f:validateLength maximum="20" />
</h:inputText>
Quando o usuário deixar este campo vazio conjuntos JSF vazio ""
cadeia em vez de null
.
Como posso corrigir este comportamento sem verificar cada corda com
if (string.equals("")) { string = null; }
Solução
Você pode configurar JSF 2.x para interpretar esvaziar valores enviados como nula pela seguinte context-param
em web.xml
(que tem um nome muito longo, que também vai ser por isso que eu não poderia recuperá-lo;)):
<context-param>
<param-name>javax.faces.INTERPRET_EMPTY_STRING_SUBMITTED_VALUES_AS_NULL</param-name>
<param-value>true</param-value>
</context-param>
Para referência e para aqueles que estão interessados, em JSF 1.2 (e, portanto, não 1.1 ou mais velhos, porque é por design não é possível ter um Converter
para java.lang.String
) este é workaroundable com o seguinte Converter
:
public class EmptyToNullStringConverter implements Converter {
public Object getAsObject(FacesContext facesContext, UIComponent component, String submittedValue) {
if (submittedValue == null || submittedValue.isEmpty()) {
if (component instanceof EditableValueHolder) {
((EditableValueHolder) component).setSubmittedValue(null);
}
return null;
}
return submittedValue;
}
public String getAsString(FacesContext facesContext, UIComponent component, Object modelValue) {
return (modelValue == null) ? "" : modelValue.toString();
}
}
... que precisa ser registrado em faces-config.xml
da seguinte forma:
<converter>
<converter-for-class>java.lang.String</converter-for-class>
<converter-class>com.example.EmptyToNullStringConverter</converter-class>
</converter>
No caso de você não estiver em Java 6, no entanto, substituir submittedValue.empty()
por submittedValue.length() == 0
.
Veja também
Outras dicas
Espero que este seja o caminho certo para dizer que eu não posso encontrar uma solução para o problema.
Eu tenho adicionar o context-param
ao meu web.xml
mas não tem nenhum resultado. Eu uso um Tomcat 6.0.24 Server com este context-param: javax.faces.PROJECT_STAGE =
Desenvolvimento duas javax.faces.VALIDATE_EMPTY_FIELDS = true