Conversor + EJB (Resolvido)

Olá pessoal, estou com problemas para fazer um p:autoComplete usando EJB 3.1.
O meu conversor esta assim:

[code]@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();
}

}[/code]

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?

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).

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

[code]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;
}

}[/code]

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

Ms entao no faces-config nao declaro nada?

segue um exemplo,

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

t+

não porque tera que ser feito manualmente

fiz as modificações que vc mandou, mas agora o carroceriaConverter vem null lá no meu bean. Oque pode ser?
Bean

[code]public List getCarrocerias() {
return carroceriaService.getCarroceria();
}

public CarroceriaConverter getConverterCarroceria() {
	if (carroceriaConverter == null) {
		carroceriaConverter.setServiceCarroceria(carroceriaService);
	}
	return carroceriaConverter;
}[/code]

XHTML:

<p:autoComplete id="genero" value="#{carretaMBean.carreta.carroceria}" completeMethod="#{carretaMBean.carrocerias}" var="carroceria" itemValue="#{carroceria}" itemLabel="#{carroceria.descricao}" dropdown="true" converter="#{carretaMBean.converterCarroceria}"/>

[quote=clever]fiz as modificações que vc mandou, mas agora o carroceriaConverter vem null lá no meu bean. Oque pode ser?
Bean

[code]public List getCarrocerias() {
return carroceriaService.getCarroceria();
}

public CarroceriaConverter getConverterCarroceria() {
	if (carroceriaConverter == null) {
		carroceriaConverter.setServiceCarroceria(carroceriaService);
	}
	return carroceriaConverter;
}[/code]

XHTML:

<p:autoComplete id="genero" value="#{carretaMBean.carreta.carroceria}" completeMethod="#{carretaMBean.carrocerias}" var="carroceria" itemValue="#{carroceria}" itemLabel="#{carroceria.descricao}" dropdown="true" converter="#{carretaMBean.converterCarroceria}"/>[/quote]

Falto voce instanciar o converter

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

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:
[code]public String getAsString(FacesContext fc, UIComponent uic, Object obj) {

	return ((Carroceria) obj).getCodigocarroceria().toString();  
}[/code]

[quote=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:
[code]public String getAsString(FacesContext fc, UIComponent uic, Object obj) {

	return ((Carroceria) obj).getCodigocarroceria().toString();  
}[/code][/quote]

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");

O método getBuscaCodigo pega a carroceria pelo código, assim:

[code]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;
}[/code]

e meu conversor esta assim:

[code]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();
}[/code]

o método getCodigocarroceria pega o código da carroceria que esta na entridade Carroceria:

[code]public class Carroceria extends AbstractEntidade {
@GeneratedValue(strategy=GenerationType.IDENTITY)
private Integer codigocarroceria;

          public Integer getCodigocarroceria() {
                return codigocarroceria;
           }
           ......
       }[/code]

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

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

Resolvi. Ficou assim:
Conversor:

[code]@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;
}[/code]

Bean:

[code]public List carrocerias(String descricao) {
return carroceriaService.getCarroceriaWithDescricao(descricao);
}

public CarroceriaConverter getConverterCarroceria() {
	if (carroceriaConverter == null) {
		carroceriaConverter = new CarroceriaConverter();
		carroceriaConverter.setServiceCarroceria(carroceriaService);
	}
	return carroceriaConverter;
}[/code]

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.

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