Estou tentando resolver um problema aqui. Preciso carregar o objeto selecionado em um SelectOneMenu no meu ManagedBean. Para isso estou usando um conversor e daí vem um dos clássicos problemas: “Erro de validação: o valor não é válido”. Já tentei de tudo, pesquisei em diversos foruns mas não consigo ver o erro que estou comentendo. Segue meus códigos:
Eu refiz meu hashCode e equals pelo IDE e agora ta dando nullPointerException. Ta acontecendo no momento que eu seto o TipoLogradouro no Endereço. Aparentemente, o converter não ta setando o objeto no MB. Sendo que meu converter ta retornando os objetos esperados. Sabe o que pode estar ocorrendo?
no bean eu seto um new TioAcao() para a propriedade tipoAcao do Processo antes de chamar o formulario.
public String setup(){
//codigo omitido
return "form";
}
[/quote]
Não entendi muito bem a sua lógica. Tentei fazer algo semelhando mas não tive sucesso. No Value do SelectOneMenu pasei #{enderecoBean.endereco.tipoLogradouro} e dei um new no meu tipoLogradouro no meu MB mesmo assim não tive sucesso. De qualquer forma não entendi a sua lógica pois o problema do selectOneMenu é que ele não passa o objeto pro ManagedBean e sim algum atributo, por isso a necessidade do converter, para converter esse numero em um objeto e vice-versa. Se puder explicar um pouco mais sobre o seu código.
Acho que entendi o seu código mas no meu caso preciso disso tanto para inserir um novo elemento quanto para editá-lo. Por exemplo, imagine que eu persista um novo objeto onde o tipoLogradouro é “AVENIDA”. Quando eu quiser editar esse objeto o SelectOneMenu deve vir preenchido com esse valor para que eu possa mudá-lo de “AVENIDA” para “RUA”. Se entendi bem, a sua solução aborda apenas o momento de inserir um novo objeto no banco, mas não de editá-lo, ou estou errado?
Na hora de editar vc recupera um objeto TipoAcao junto com o objeto Processo, na hora de recuperar passando um id do Processo por exemplo ele já preenche o selectonemenu com o valor do TipoAcao.
Não estou tendo sucesso em usar esse SelectOneMenu. Como uma coisa tão simples consegue ser tão complicada? Pelo menos pra mim…
Mas vms la.
Meu conversor está assim atualmente:
@FacesConverter(value="tipoLogradouroConverter", forClass=TipoLogradouro.class)
public class TipoLogradouroConverter implements Converter {
@Override
public Object getAsObject(FacesContext arg0, UIComponent arg1, String valor) {
if (valor != null && !valor.equals("")){
return new TipoLogradouroDAO().busca(Integer.parseInt(valor));
}
return null;
}
@Override
public String getAsString(FacesContext arg0, UIComponent arg1, Object objeto) {
if (objeto != null && objeto instanceof TipoLogradouro) {
return ((TipoLogradouro)objeto).getId().toString();
}
return null;
}
}
O trecho de código do SelectOneMenu:
<h:selectOneMenu value="#{funcionarioBean.tipoLogradouro}" converter="tipoLogradouroConverter" >
<f:selectItem itemLabel="Selecione um Tipo de Logradouro..." itemValue="" />
<f:selectItems value="#{funcionarioBean.tiposLogradouros}" var="tipoLogradouro"
itemValue="#{tipoLogradouro}" itemLabel="#{tipoLogradouro.descricao}" />
</h:selectOneMenu>
Meu sistema possui um dataTable que lista todos os funcionários (endereço, tipo logradouro são atributos de funcionário). Abaixo existem dois botões, novo e editar. Eu invoco o botão novo normalmente, o selectOneMenu funciona normalmente e salva o valor selecionado no selectOneMenu. O meu problema está no momento de editar esse campo. Não consigo carregá-lo no momento de editar. Todas as outras informações vem normalmente e consigo carregá-las normalmente, mas o selectOneMenu não consigo.
No botão editar é invocado o seguinte método que :
public void editar() {
if (this.pessoa.getEndereco().getTipoLogradouro() != null){
this.tipoLogradouro = this.pessoa.getEndereco().getTipoLogradouro();
}
}
desta forma acredito que carrego o tipoLogradouro na minha variável que armazena esse valor na view.
No momento que eu clico dou um render e um update no form que contem esses crud de funcionário.