Conversor + EJB (Resolvido)

14 respostas
C
Olá pessoal, estou com problemas para fazer um p:autoComplete usando EJB 3.1. O meu conversor esta assim:
@FacesConverter(value="carroceriaConverter", forClass = java.lang.String.class)
public class CarroceriaConverter implements Converter {

    @EJB
    private CarroceriaService serviceCarroceria;

    @Override
    public Object getAsObject(FacesContext fc, UIComponent uic, String string) {
        Carroceria carroceria = null;
        try {
            carroceria = serviceCarroceria.getCarroceriaWithDescricao(string);
        } catch (ClassNotFoundException ex) {
            Logger.getLogger(CarroceriaConverter.class.getName()).log(Level.SEVERE, null, ex);
        } catch (PersistenceException ex) {
            Logger.getLogger(CarroceriaConverter.class.getName()).log(Level.SEVERE, null, ex);
        }
        return carroceria;
    }

    @Override
    public String getAsString(FacesContext fc, UIComponent uic, Object obj)
            throws ClassCastException {

        Carroceria combustivel = (Carroceria) obj;
        return combustivel.getDescricao();
    }
}
No meu faces-config declarei o conversor assim:
<managed-bean>  
       <managed-bean-name>carroceriaConverter</managed-bean-name>  
       <managed-bean-class>br.com.transbr.converrsores.CarroceriaConverter</managed-bean-class>  
       <managed-bean-scope>request</managed-bean-scope>  
    </managed-bean>
E no xhtml chamo ele assim:
<p:autoComplete id="genero" value="#{carretaMBean.carreta.carroceria}"
		completeMethod="#{carretaMBean.carrocerias}" var="carroceria" itemValue="#{carroceria}"
		itemLabel="#{carroceria.descricao}" dropdown="true" converter="carroceriaConverter"/>

O problame é que o meu serviceCarroceria no conversor esta retornando null nao sei porque. Alguem pode me ajudar?

14 Respostas

L

Vc não declara o conversor como um ManagedBean, tem a parte própria dele no faces-config.xml.

Eu removeria a declaração dele no faces-config(JEE 6 usa mais anotações que XML) e colocaria um @Named(“carroceriaConverter”) no conversor.(Acho que não precisa da anotação FacesConverter/Named juntos faz os testes com as duas e depois com uma de cada vez e vê com qual funciona).

L
O EJB não é injetado em Converter o que voce tera que fazer é remover
@FacesConverter(value="carroceriaConverter", forClass = java.lang.String.class)

remover a configuração no faces-config

e colocar uma instancia dele no seu managed bean e o seu EJB tambem ex

public class CidadeConverter implements Converter, Serializable
{
	private static final long	serialVersionUID	= 1L;
	private CidadeService		service				= null;

	@Override
	public Object getAsObject(FacesContext arg0, UIComponent arg1, String arg2)
	{
		return service.findById(Integer.parseInt(arg2));
	}

	@Override
	public String getAsString(FacesContext arg0, UIComponent arg1, Object arg2)
	{
		return ((Cidade) arg2).getId().toString();
	}

	public CidadeService getService()
	{
		return service;
	}

	public void setService(CidadeService service)
	{
		this.service = service;
	}
}
public EnderecoBean
{
private CidadeConverter					cidadeConverter				= null;
@EJB
private CidadeService					        cidadeService				= null;



	public CidadeConverter getConverterCidade()
	{
		if(cidadeConverter == null)
               {
			cidadeConverter = CidadeConverter();
                        cidadeConverter.setService(cidadeService);
                }
		return cidadeConverter;
	}
}

Seu xhtml no componente use a tag converter dele passando o metodo get do seu bean

Espero que tenha entendido

C

Ms entao no faces-config nao declaro nada?

A

segue um exemplo,

http://www.mkyong.com/jsf2/custom-converter-in-jsf-2-0/

t+

L

não porque tera que ser feito manualmente

C
fiz as modificações que vc mandou, mas agora o carroceriaConverter vem null lá no meu bean. Oque pode ser? Bean
public List<Carroceria> getCarrocerias() {
		 return carroceriaService.getCarroceria();
	 }

	public CarroceriaConverter getConverterCarroceria() {
		if (carroceriaConverter == null) {
			carroceriaConverter.setServiceCarroceria(carroceriaService);
		}
		return carroceriaConverter;
	}
XHTML:
<p:autoComplete id="genero" value="#{carretaMBean.carreta.carroceria}"
								completeMethod="#{carretaMBean.carrocerias}" var="carroceria" itemValue="#{carroceria}"
							    itemLabel="#{carroceria.descricao}" dropdown="true" converter="#{carretaMBean.converterCarroceria}"/>
L
clever:
fiz as modificações que vc mandou, mas agora o carroceriaConverter vem null lá no meu bean. Oque pode ser? Bean
public List<Carroceria> getCarrocerias() {
		 return carroceriaService.getCarroceria();
	 }

	public CarroceriaConverter getConverterCarroceria() {
		if (carroceriaConverter == null) {
			carroceriaConverter.setServiceCarroceria(carroceriaService);
		}
		return carroceriaConverter;
	}
XHTML:
<p:autoComplete id="genero" value="#{carretaMBean.carreta.carroceria}"
								completeMethod="#{carretaMBean.carrocerias}" var="carroceria" itemValue="#{carroceria}"
							    itemLabel="#{carroceria.descricao}" dropdown="true" converter="#{carretaMBean.converterCarroceria}"/>

Falto voce instanciar o converter

public CarroceriaConverter getConverterCarroceria() {
		if (carroceriaConverter == null) {
                        carroceriaConverter = new CarroceriaConverter();
			carroceriaConverter.setServiceCarroceria(carroceriaService);
		}
		return carroceriaConverter;
	}
C

Agora esta dando o seguinte erro:
[javax.enterprise.resource.webcontainer.jsf.lifecycle] (http--127.0.0.1-8080-2) For input string: "":
java.lang.NumberFormatException: For input string: ""
at java.lang.NumberFormatException.forInputString(NumberFormatException.java:48) [:1.6.0_20]
at java.lang.Integer.parseInt(Integer.java:470) [:1.6.0_20]
at java.lang.Integer.parseInt(Integer.java:499) [:1.6.0_20]
at br.com.transbr.converrsores.CarroceriaConverter.getAsObject(CarroceriaConverter.java:21) [classes:]

Nesse método do converter:
public String getAsString(FacesContext fc, UIComponent uic, Object obj) {

    	return ((Carroceria) obj).getCodigocarroceria().toString();  
    }
L
clever:
Agora esta dando o seguinte erro: [javax.enterprise.resource.webcontainer.jsf.lifecycle] (http--127.0.0.1-8080-2) For input string: "": java.lang.NumberFormatException: For input string: "" at java.lang.NumberFormatException.forInputString(NumberFormatException.java:48) [:1.6.0_20] at java.lang.Integer.parseInt(Integer.java:470) [:1.6.0_20] at java.lang.Integer.parseInt(Integer.java:499) [:1.6.0_20] at br.com.transbr.converrsores.CarroceriaConverter.getAsObject(CarroceriaConverter.java:21) [classes:] Nesse método do converter:
public String getAsString(FacesContext fc, UIComponent uic, Object obj) {

    	return ((Carroceria) obj).getCodigocarroceria().toString();  
    }
O metodo
getCodigocarroceria
faz o q? esse erro geralmente é por esta dando Tenntado converter para integer ou double uma string inválida tipo
Integer.parseInt("A");
C
O método getBuscaCodigo pega a carroceria pelo código, assim:
public Carroceria getBuscaCodigo(Integer codigocaroceria) {
		Session ses = getSession();
		
		Query query = ses.createQuery("SELECT cria FROM Carroceria cria WHERE cria.codigocarroceria = :codigocarroceria");
        query.setInteger("codigocarroceria", codigocaroceria);
        Carroceria carroceria = (Carroceria) query.uniqueResult();
        
        return carroceria;
	}
e meu conversor esta assim:
public Object getAsObject(FacesContext fc, UIComponent uic, String value) {
		return carroceriaService.getBuscaCodigo(Integer.parseInt(value));
    }

    public String getAsString(FacesContext fc, UIComponent uic, Object value) {
		return ((Carroceria) value).getCodigocarroceria().toString();
    }
C
o método getCodigocarroceria pega o código da carroceria que esta na entridade Carroceria:
public class Carroceria extends AbstractEntidade {
              @GeneratedValue(strategy=GenerationType.IDENTITY)
              private Integer codigocarroceria;

              public Integer getCodigocarroceria() {
                    return codigocarroceria;
               }
               ......
           }
L

Amigo voce tem certeza que o erro esta nesse metodo e não no metodo

public Object getAsObject(FacesContext arg0, UIComponent arg1, String arg2) ?

C
Resolvi. Ficou assim: Conversor:
@EJB
	private CarroceriaService carroceriaService = null;

	@Override
	public Object getAsObject(FacesContext fc, UIComponent uic, String value) {
		if (value.isEmpty()) {
			return null;
		}
		return carroceriaService.getBuscaCodigo(Integer.parseInt(value));
	}

	@Override
	public String getAsString(FacesContext fc, UIComponent uic, Object value) {
		return ((Carroceria) value).getCodigocarroceria().toString();
	}

	public CarroceriaService getServiceCarroceria() {
		return carroceriaService;
	}

	public void setServiceCarroceria(CarroceriaService serviceCarroceria) {
		this.carroceriaService = serviceCarroceria;
	}
Bean:
public List<Carroceria> carrocerias(String descricao) {  
         return carroceriaService.getCarroceriaWithDescricao(descricao);  
    }  

	public CarroceriaConverter getConverterCarroceria() {
		if (carroceriaConverter == null) {
			carroceriaConverter = new CarroceriaConverter();
			carroceriaConverter.setServiceCarroceria(carroceriaService);
		}
		return carroceriaConverter;
	}
xhtml:
<p:autoComplete id="genero" value="#{carretaMBean.carreta.carroceria}"  
                                completeMethod="#{carretaMBean.carrocerias}" var="carroceria" itemValue="#{carroceria}"  
                                itemLabel="#{carroceria.descricao}" dropdown="true" converter="#{carretaMBean.converterCarroceria}"/>

Muito obrigado pela ajuda.
Abraço.

L

Beleza, coloque resolvido no começo do titulo do topico

Criado 30 de novembro de 2011
Ultima resposta 2 de dez. de 2011
Respostas 14
Participantes 4