Olá… Tenho um selectOneMenu que é atualizado com ajax, após o pais ser selecionado…
Quando utilizo o escopo de Request e utilizo os metodos equals e hash do super(AbstractEntity), o item que vem selecionado no <f:selectItems> é o último da lista… no caso dos estados, Tocantins…
Não sei porque isto acontece…
Quando utilizo o escopo de Sessão e sobrescrevo os metodos do super no meu Estado.class, o erro não ocorre…
Alguem sabe porque disto? Não queria utilizar Session…
selectOneMenu
<p:selectOneMenu value="#{estadoBean.estado}" id="estadoRg"
converter="entityConverter">
<p:ajax listener="#{pessoaBean.adicionarEstado('rg')}">
</p:ajax>
<f:selectItems value="#{estadoBean.estados}" var="estado"
itemLabel="#{estado.sigla}" itemValue="#{estado}"></f:selectItems>
</p:selectOneMenu>
Este é converter:
@FacesConverter(value = "entityConverter")
public class EntityConverter implements Converter {
public Object getAsObject(FacesContext ctx, UIComponent component,
String value) {
if (value != null) {
return this.getAttributesFrom(component).get(value);
}
return null;
}
public String getAsString(FacesContext ctx, UIComponent component,
Object value) {
if (value != null && ! "".equals(value)) {
AbstractEntity entity = (AbstractEntity) value;
if (entity.getId() != null) {
this.addAttribute(component, entity);
if (entity.getId() != null) {
return String.valueOf(entity.getId());
}
return (String) value;
}
}
return "";
}
private void addAttribute(UIComponent component, AbstractEntity o) {
this.getAttributesFrom(component).put(o.getId().toString(), o);
}
private Map<String, Object> getAttributesFrom(UIComponent component) {
return component.getAttributes();
}
}
Este é o hash e o equals do AbstractEntity:
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((id == null) ? 0 : id.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
AbstractEntity other = (AbstractEntity) obj;
if (id == null) {
if (other.id != null)
return false;
} else if (!id.equals(other.id))
return false;
return true;
}
E este o hash e equals do Estado (que sobrescreve o AbstractEntity):
public boolean equals(Object other) {
return other instanceof Estado && (id != null) ? id
.equals(((Estado) other).id) : (other == this);
}
public int hashCode() {
return id != null ? this.getClass().hashCode() + id.hashCode() : super
.hashCode();
}