Converter JSF

Ok, ok…
Sei que haverá gente sedenta de sangue dizendo que já tem milhões de tópicos sobre isso, mas eu realmente estou fazendo uma busca intensiva e não estou encontrando solução.
Li inúmeras questões e não resolvi. Imagino que seja algo bem simples e que até me deparei com a resposta nos tantos tópicos que vi pela web, mas não consegui aplicar não.
… Ou talvez eu seja muito estúpido.
Bom… Comecei a mexer em JSF ontem e estou aplicando num projetinho aqui no trabalho, mas já perdi bastante tempo nisso.
Enfim.

O erro que está dando é o seguinte:

Erro de expressão: Objeto denominado: cargoConverter não encontrado.

O que quero fazer é uma inserção de Pessoa.
Segue o xhtml:

<h:panelGrid columns = "3">
                <h:outputLabel for = "matricula" value ="Matricula:"/>
                <h:inputText value="#{pessoaController.pessoa.matricula}" id="matricula"/>
                <h:message for="matricula" errorClass="invalid"/>

                <h:outputLabel for = "nome" value ="Nome:"/>
                <h:inputText value="#{pessoaController.pessoa.nome}" id="nome"/>
                <h:message for="nome" errorClass="invalid"/>


                <h:outputLabel for = "cargo" value ="Cargo:"/>
                <h:selectOneMenu value="#{pessoaController.pessoa.cargo}" id="cargo">
                    <f:selectItems value="#{cargoController.all}" var="cargo"
                                   itemLabel="#{cargo.nome}" itemValue="#{cargo.id}"/>
                    <f:converter converterId="cargoConverter" />
                </h:selectOneMenu>
	            <h:message for="cargo" errorClass="invalid"/>


</h:panelGrid>

Converter:

@FacesConverter(value = "cargoConverter")
public class CargoConverter implements Converter {
	@Inject
	private CargoDao dao;

	public Object getAsObject(FacesContext facesContext, UIComponent uiComponent, String value) {
        if (value.isEmpty()) {
            return null;
        } else {
            return dao.findById(Long.getLong(value));
        }
	}

	public String getAsString(FacesContext facesContext, UIComponent uiComponent, Object value) {
        if (value == null || value.equals("")) {
            return "";
        } else {
            return String.valueOf(((Cargo) value).getId());
        }
	}
}

No PessoaController eu só tenho os atributos:

@Inject
private PessoaDao pessoaDao;
private Pessoa pessoa;

Cargo é uma classe e é um dos atributos de Pessoa.

Muito obrigado

Esqueci de dizer que estou usando JSF 2 e Spring

Tanta mapear teu conversor assim

@FacesConverter(forClass = Cargo.class, value = "cargoConverter")

Deu a mesma coisa :frowning:

Ao meu ver está correto.

Então faça da forma “antiga”.

Coloque no faces-config…

	<converter>
		<display-name>CargoConverter</display-name>
		<converter-id>CargoConverter</converter-id>
		<converter-class>meu.path.completo.do.pacote.CargoConverter</converter-class>
	</converter>

Cara…
Funfa no xml blz.
Muito obrigado.

Mas seria ótimo poder usar as modernidades do JSF 2.
Se alguem tiver alguma ideia…

Outra coisa… o selectItems não está passando o id do cargo como value.
No converter, ele está recebendo o nome do cargo.
Fui verificar o html que ele está gerando e vi que ele está fazendo

<option>Nome</option>

ao invés de

<option value = "1">Nome</option>

não tava mostrando o value pq no getAsString do Converter eu precisava retornar o value.toString(); ¬¬

1 curtida