[quote=felipeguerra]Não sei se é o jeito mais rápido, mas vc pode adicionar uma tag message para cada componente que recebe uma entrada do usuário, tipo:
Aí, o que mostrar o erro, vc já mata!
PS - Para componentes que são populados pelo Backing Bean, isso ocorre também.[/quote]
Eu sei que faz algum tempo… mas como passei por aqui com o mesmo problema fica uma opção de solução.
No meu caso tive o mesmo retorno de erro e resolvi implementando os métodos ‘hashCode’ e ‘equals’ na classe do Objeto que usava no Converter.
/**
* Objeto de conversão de um 'LTEmissorDdd' para o jsf
*
* @author Marcio.Marins
* @since 29/01/2010
*/
public class LTEmissorDddConverter implements Converter {
/** Log da classe. */
private static Logger logger;
private LTEmissorDDD emissorDDD;
/**
* Construtor
*/
public LTEmissorDddConverter() {
logger = Logger.getLogger(LTEmissorDddConverter.class);
logger.debug("Inicializando o conversor de LTEmissorDdd.");
}
@Override
public Object getAsObject(FacesContext fContext, UIComponent uiComponent, String value) {
if (value == null) {
emissorDDD = null;
}
if (value.contains("+")) {
String[] data = value.split("\\+");
emissorDDD = new LTEmissorDDD();
emissorDDD.setId(Integer.parseInt(data[0]));
emissorDDD.setDdd(Integer.parseInt(data[1]));
emissorDDD.setLocalidade(data[2]);
}
return emissorDDD;
}
@Override
public String getAsString(FacesContext fContext, UIComponent uiComponent, Object value) {
if (value == null) {
return null;
}
String data = null;
if (value instanceof LTEmissorDDD){
emissorDDD = (LTEmissorDDD) value;
data = emissorDDD.getId() + "+";
data += emissorDDD.getDdd() + "+";
data += emissorDDD.getLocalidade();
} else {
throw new ConverterException("Erro na conversão, era esperado um objeto do tipo 'LTEmissorDdd'.");
}
return data;
}
Agora os métodos que resolveram meu problema na classe da Entidade LTEmissorDDD:
*é só usar o gerador de código do eclipse, hashcode e equals.
/**
* {@inheritDoc}
* @see java.lang.Object#hashCode()
*/
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((id == null) ? 0 : id.hashCode());
return result;
}
/**
* {@inheritDoc}
* @see java.lang.Object#equals(java.lang.Object)
*/
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
LTEmissorDDD other = (LTEmissorDDD) obj;
if (id == null) {
if (other.id != null)
return false;
} else if (!id.equals(other.id))
return false;
return true;
}
Verifique se seu entity manager está com nome de entityManager, e n outro… pelo que vi aqui se tiver outro nome, você tem que especificar no components.xml. (foi oque entendi).
Mudei o meu de “em” pra “entityManager” e deu certo aqui… =D
(tem que usar o <s:convertEntity/> la na view, e <s:selectItems>, n <f:selectItems>).