[Resolvido] Problema com conversores JSF

5 respostas
laiszanfolim

Olá… Estou com problemas nos conversores personalizados em JSF.

Tenho um formulário de vendas, que utiliza um produto e um vendedor já cadastrados.
Preciso converter o objeto no id dele, para salvar na tabela da venda o id, do produto selecionado e não o produto.

Fiz um conversor para Produto. Segue abaixo

public class ProductConverter implements Converter{
private ProductDAO prodDAO = new ProductDAO();

@Override
public Object getAsObject(FacesContext context, UIComponent component, String value) {
    Integer code = Integer.parseInt(value);
    try {
        return prodDAO.getById(code);
    } catch (ClassNotFoundException ex) {
        Logger.getLogger(ProductConverter.class.getName()).log(Level.SEVERE, null, ex);
    } catch (SQLException ex) {
        Logger.getLogger(ProductConverter.class.getName()).log(Level.SEVERE, null, ex);
    }
    return null;
}

@Override
public String getAsString(FacesContext context, UIComponent component, Object value) {
    Product prod = (Product) value;
    return String.valueOf(prod.getCode());
}

Implementei os métodos de equals e hashCode no Bean do Produtos e configurei o conversor no faces-config da seguinte maneira:

ProductConverter CompleteJSFApp.converter.ProductConverter

Exatamente tudo igual manda os tutoriais. Mas na hora de usar o conversor na view dá erro. Segue um trecho da view

Adding a new sale 


product: <h:selectOneMenu value="#{SaleFace.selectedSale.product}">

<f:selectItems value="#{SaleFace.products}"/>

<f:converter converterId=“ProductConverter”/>

</h:selectOneMenu>


Adress: <h:inputText value="#{SaleFace.selectedSale.adress}"/>


vendor: <h:selectOneMenu value="#{SaleFace.selectedSale.vendor}">

<f:selectItems value="#{SaleFace.vendors}"/>

<f:converter converterId=“LoginConverter”/>

</h:selectOneMenu>

O erro que tenho é o seguinte:

descriptionThe server encountered an internal error () that prevented it from fulfilling this request.

exception

javax.servlet.ServletException: CompleteJSFApp.converter.LoginConverter

root cause

javax.faces.FacesException: CompleteJSFApp.converter.LoginConverter

root cause

java.lang.ClassNotFoundException: CompleteJSFApp.converter.LoginConverter

Alguém pode me ajudar a solucionar o problema? Não consigo encontrar soluções na internet, nem em alguns livros.
Obrigada

5 Respostas

H

Olá, a causa do erro é classe não encontrada (ClassNotFoundException)

root cause
javax.faces.FacesException: CompleteJSFApp.converter.LoginConverter

root cause
java.lang.ClassNotFoundException: CompleteJSFApp.converter.LoginConverter

Não consegui entender a sua lógica.
Coloque código entre as tags code.

rponte

Olá laiszanfolim,

Que tal utilizar um entity converter mais generico para estes cenários?
Assim você evitar ter que criar um converter para cada entidade da aplicação.

Se puder, dê uma olhada neste post, creio que ele poderá te ajudar,
http://www.rponte.com.br/2008/07/26/entity-converters-pra-da-e-vender/

Abraços e boa sorte.

laiszanfolim

Ajustei os códigos nas tags para ficar melhor de entender

Olá... Estou com problemas nos conversores personalizados em JSF.

Tenho um formulário de vendas, que utiliza um produto e um vendedor já cadastrados.
Preciso converter o objeto no id dele, para salvar na tabela da venda o id, do produto selecionado e não o produto.

Fiz um conversor para Produto. Segue abaixo

public class ProductConverter implements Converter{
private ProductDAO prodDAO = new ProductDAO();

@Override
public Object getAsObject(FacesContext context, UIComponent component, String value) {
Integer code = Integer.parseInt(value);
try {
return prodDAO.getById(code);
} catch (ClassNotFoundException ex) {
Logger.getLogger(ProductConverter.class.getName()).log(Level.SEVERE, null, ex);
} catch (SQLException ex) {
Logger.getLogger(ProductConverter.class.getName()).log(Level.SEVERE, null, ex);
}
return null;
}

@Override
public String getAsString(FacesContext context, UIComponent component, Object value) {
Product prod = (Product) value;
return String.valueOf(prod.getCode());
}

Implementei os métodos de equals e hashCode no Bean do Produtos e configurei o conversor no faces-config da seguinte maneira:

<converter>
<converter-id>ProductConverter</converter-id>
<converter-class>CompleteJSFApp.converter.ProductConverter</converter-class>
</converter>
Exatamente tudo igual manda os tutoriais. Mas na hora de usar o conversor na view dá erro. Segue um trecho da view
Adding a new sale <br/>
product: <h:selectOneMenu value="#{SaleFace.selectedSale.product}">
<f:selectItems value="#{SaleFace.products}"/>
<f:converter converterId="ProductConverter"/>
</h:selectOneMenu><br/>
Adress: <h:inputText value="#{SaleFace.selectedSale.adress}"/><br/>
vendor: <h:selectOneMenu value="#{SaleFace.selectedSale.vendor}">
<f:selectItems value="#{SaleFace.vendors}"/>
<f:converter converterId="LoginConverter"/>
</h:selectOneMenu> <br/>

O erro que tenho é o seguinte:

descriptionThe server encountered an internal error () that prevented it from fulfilling this request.

exception

javax.servlet.ServletException: CompleteJSFApp.converter.LoginConverter

root cause

javax.faces.FacesException: CompleteJSFApp.converter.LoginConverter

root cause

java.lang.ClassNotFoundException: CompleteJSFApp.converter.LoginConverter

Alguém pode me ajudar a solucionar o problema? Não consigo encontrar soluções na internet, nem em alguns livros.
Obrigada

rponte

Oi,

Provavelmente o erro seja o caminho da tua classe converter no face-config.xml. Remova o “CompleteJSFApp.” da tag “converter-class”, pois não é necessário o nome do projeto.

laiszanfolim

Nossa… acho que bugou o NetBeans…rs

Passei tanto tempo tentando arrumar e nada. Ai você falou de retirar o nome do projeto… mas aquele era o nome do pacote… ai fiquei pensando no ClassNotFound… ai resolvi apagar o pacote e criar as classes de novo, mas copiei o conteúdo… e deu certo!

Tinha alguma coisa idiota acontecendo… mas eu fico muito feliz por ter resolvido… fiquei um tempão emperrrada nesse problema.
Obrigada pela ajuda :smiley:

Criado 13 de fevereiro de 2010
Ultima resposta 15 de fev. de 2010
Respostas 5
Participantes 3