JSF - Converter not found [RESOLVIDO]

9 respostas
D

Galera eis a exception…

SEVERE: Servlet.service() for servlet [facesServlet] in context with path [/ProjetoOlimpio] threw exception [Expression Error: Named Object: tipoAcaoConverter not found.] with root cause javax.faces.FacesException: Expression Error: Named Object: tipoAcaoConverter not found. at com.sun.faces.application.ApplicationImpl.createConverte

eis o front end:

<p:outputLabel for="tipo" value="#{msg['entity.tipoAcao']}"/>
				<p:selectOneMenu id="tipo" required="true" converter="tipoAcaoConverter" value="#{acaoController.entity.tipoAcao}" >
						<f:selectItem itemLabel="#{msg['label.selecione.item']}" itemValue="" noSelectionOption="true"/>
						<f:selectItems value="#{tipoAcaoController.listAll}" var="tipoAcao" itemLabel="#{tipoAcao.descricao}" itemValue="#{tipoAcao}" />
				</p:selectOneMenu>

Eis o Converter (q na verdade é um MB)

@ManagedBean(name = "tipoAcaoConverter")
@RequestScoped
public class TipoAcaoConverter extends BaseConverter<TipoAcao, Integer> implements Serializable {

	private static final long serialVersionUID = 1L;

	@ManagedProperty("tipoAcaoService")
	private TipoAcaoService tipoAcaoService;

	public TipoAcaoConverter() {
	}

	@PostConstruct
	public void init() {
		super.setEntityClass(TipoAcao.class);
		super.setBaseService(tipoAcaoService);
	}

}

Aí eu tenho um BaseConverter abstrato que não vem ao caso… Se precisar é só pedir!!

9 Respostas

R

Você o deixou como ManagedBean, portanto precisa referenciá-lo com EL.
Altere disso:converter="tipoAcaoConverter" para isso: converter="#{tipoAcaoConverter}"

H

Rodrigo Sasaki:
Você o deixou como ManagedBean, portanto precisa referenciá-lo com EL.
Altere disso:converter="tipoAcaoConverter" para isso: converter="#{tipoAcaoConverter}"
caso não funcione, tente anotar teu converter com @FacesConverter.

R

acho que para ser um conveter deveria seguir o modelo adotado pelo faces algo do tipo

/**
 *
 * @author Rogério Martins da Silva 09/02/2012
 * http://www.usinaweb.inf.br
 */
@FacesConverter(value = "statusAlunoConverter")
public class StatusAlunoConverter implements Converter {

    @Override
    public Object getAsObject(FacesContext fc, UIComponent uic, String string) {
        throw new UnsupportedOperationException("Not supported yet.");
    }

    @Override
    public String getAsString(FacesContext context, UIComponent component, Object value) {
        String retorno = new String();
        if (value.equals("0")) {
            retorno = "Inativo";
        } else if (value.equals("1")) {
            retorno = "Ativo";
        } else {
            retorno = "Transferido";
        }
        return retorno;
    }
}
R

Verdade, acho que também precisa anotar com @FacesConverter, mas não tenho certeza. Nunca testei sem.

H
rogerioeerr:
acho que para ser um conveter deveria seguir o modelo adotado pelo faces algo do tipo
/**
 *
 * @author Rogério Martins da Silva 09/02/2012
 * http://www.usinaweb.inf.br
 */
@FacesConverter(value = "statusAlunoConverter")
public class StatusAlunoConverter implements Converter {

    @Override
    public Object getAsObject(FacesContext fc, UIComponent uic, String string) {
        throw new UnsupportedOperationException("Not supported yet.");
    }

    @Override
    public String getAsString(FacesContext context, UIComponent component, Object value) {
        String retorno = new String();
        if (value.equals("0")) {
            retorno = "Inativo";
        } else if (value.equals("1")) {
            retorno = "Ativo";
        } else {
            retorno = "Transferido";
        }
        return retorno;
    }
}
Esse é o modo correto. Mas quando se precisa injetar alguma coisa dentro do Converter, até a versão atual do JSF, isso não é possível. A saída (POG recomendada por muitos, mas muitos mesmo) é de anotar o Converter como MB.
R

verdade sei que não se pode injetar Ejbs através de um converter, entaum eu faço um lookup para tal

R

É, essas geralmente são as 2 soluções apontadas, ou você faz um lookup (através de um Service Locator, ou até na mão mesmo), ou anota seu Converter/Validator como ManagedBean.

Na versão 2.2 do JSF, já será suportada injeção em Converters e Validators, mas por enquanto, tem que ser feito algum “workaround”

D

Galera…

Como estou usando Spring, eu resolvi assim:

@Component
@Scope("request")

e na view eu coloquei o # { } que eu tinha esquecido

valeu galera!
desculpa pelo erro besta!

H
Criado 10 de dezembro de 2012
Ultima resposta 10 de dez. de 2012
Respostas 9
Participantes 4