Para mim acontece a mesma coisa, acredito que seja problema no Mojarra
como o Flavio falou.
Como alternativa resolvi atribuir um itemValue para o f:selectItem,
assim:
<h:selectOneMenu id="item"
value="#{servicosController.contratoServicoSelecionado}"
required="true" requiredMessage="Serviço não foi
selecionado">
<f:selectItem itemLabel="Selecione um Serviço" itemValue="0"
noSelectionOption="true" />
<f:selectItems
value="#{servicosComAsController.contratoServicoList}" var="item"
itemLabel="#{item.codContratoServico} - #{item.descricao}"
itemValue="#{item}" />
<f:converter converterId="converterContratoServico" />
</h:selectOneMenu>
@FacesConverter(value = "converterContratoServico", forClass =
ContratoServico.class)
public class ContratoServicoConverter implements Converter {
@Override
public Object getAsObject(FacesContext context, UIComponent
component, String value) {
try {
if (value == null || value.equals("") ||
value.equals("0")) {
return null;
}
int id = Integer.parseInt(value);
ContratoServicoFacade contratoServicoFacade =
(ContratoServicoFacade)
AppContext.getApplicationContext().getBean("ContratoServicoFacade");
return contratoServicoFacade.find(id);
} catch (NumberFormatException ne) {
throw new ConverterException(new
FacesMessage(FacesMessage.SEVERITY_ERROR, "Não foi possível converter
'" + value + "' para ContratoServico: identificador não é um número
inteiro.", ne.getMessage()));
} catch (IllegalArgumentException e) {
throw new ConverterException(new
FacesMessage(FacesMessage.SEVERITY_ERROR, "Não foi possível converter
'" + value + "' para ContratoServico: identificador desconhecido.",
e.getMessage()));
}
}
@Override
public String getAsString(FacesContext context, UIComponent
component, Object value) {
if (value == null || value.equals("") || value.equals("0")) {
return null;
}
if (value instanceof ContratoServico) {
ContratoServico aux = (ContratoServico) value;
return aux.getCodContratoServico().toString();
} else if (value instanceof Integer || value instanceof
String) {
return value.toString();
} else {
throw new ConverterException(new
FacesMessage(FacesMessage.SEVERITY_ERROR, "ERRO", "(" +
value.getClass() + ") não é uma instância."));