Bua tarde, alguém tem um exemplo de converter para SelectOneMenu do primifaces 3.4 e jsf2.0.
já fiz o converter de várias maneiras mas sempre dá Erro de conversão ao definir o valor '30' para 'null Converter'.
estou trabalhando com Jboss, Ejb3.1.
se tiver como me ajudar eu coloco os códigos aqui.
fico muito agradecido.
Seu converter não foi identificado no xhtml, poderia postar o trecho do xhtml e o converter em questão?
Claro, tomara que seja isto, tem 10 dias que eu estou sofrendo com isto, não sei se o meu converter também está correto, é a primeira vez que trabalho com este tipo de conversor, como eu trabalhava com jsp e servlets eu utilizava outro tipo de converter.
XHTML
<h:outputText value="Clientes: " />
<p:selectOneMenu value="#{contatoBean.contato.cliente}" effect="fade" converter="#{contatoConverter}">
<f:selectItem itemLabel="-Escolha-" itemValue="#" />
<f:selectItems value="#{contatoBean.clientes}" var="contato" itemLabel="#{contato.nome}" itemValue="#{contato.idCliente}"/>
</p:selectOneMenu> [/code]
Converter
[code]
package br.com.startup.s3.util;
import java.util.ArrayList;
import java.util.List;
import javax.faces.component.UIComponent;
import javax.faces.component.UISelectItems;
import javax.faces.context.FacesContext;
import javax.faces.convert.Converter;
import javax.faces.convert.FacesConverter;
import javax.faces.model.SelectItem;
@FacesConverter(value = "contatoConverter")
public class ContatoConverter implements Converter{
private int index;
public Object getAsObject(FacesContext facesContext, UIComponent uicomp, String value) {
List<SelectItem> items = new ArrayList<SelectItem>();
List<UIComponent> uicompList = uicomp.getChildren();
for(UIComponent comp: uicompList){
if(comp instanceof UISelectItems){
items.addAll((List<SelectItem>) ((UISelectItems)comp).getValue());
}
}
return "-1".equals(value) ? null : items.get(Integer.valueOf(value)).getValue();
}
public String getAsString(FacesContext facesContext, UIComponent uicomp, Object entity) {
return entity == null ? "-1" : String.valueOf(index++);
}
}[/code]
ManagedBean[code]
package br.com.startup.s3.controller;
import java.util.List;
import javax.ejb.EJB;
import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import javax.faces.context.FacesContext;
import br.com.startup.s3.ejb.ClienteFacadeBean;
import br.com.startup.s3.ejb.ContatoFacadeBean;
import br.com.startup.s3.entidade.Cliente;
import br.com.startup.s3.entidade.Contato;
import br.com.startup.s3.ex.StartupException;
@ManagedBean(name="contatoBean")
@SessionScoped
public class ContatoBean {
@EJB
private ContatoFacadeBean contatoFacade;
@EJB
private ClienteFacadeBean clienteFacade;
private Contato contato;
private Cliente cliente;
private List<Contato>contatos;
private List<Cliente>clientes;
public ContatoBean() {
contato = new Contato();
}
//Inserir
public void prepararInserir(){
contato = new Contato();
}
public void prepararAtualizar(Integer id) throws StartupException{
contato = contatoFacade.buscarContatoPelaChave(id);
}
public void inserir() throws StartupException{
contatoFacade.inserirContato(contato);
//Mensagem Growl
FacesContext context = FacesContext.getCurrentInstance();
context.addMessage(null, new FacesMessage("contato cadastrado com sucesso! "));
contato = new Contato();
}
public void atualizar() throws StartupException{
contatoFacade.alterarContato(contato);
//Mensagem Growl
FacesContext context = FacesContext.getCurrentInstance();
context.addMessage(null, new FacesMessage("contato atualizado com sucesso! "));
contato = new Contato();
}
public void deletar() throws StartupException{
FacesContext context = FacesContext.getCurrentInstance();
boolean resultado = contatoFacade.removerContato(contato);
if (resultado) {
contato = new Contato();
context.addMessage(null, new FacesMessage("contato removido com sucesso!"));
} else {
context.addMessage(null, new FacesMessage("Falha ao remover contato!"));
}
}
/////GET e Set
public ContatoFacadeBean getContatoFacade() {
return contatoFacade;
}
public void setContatoFacade(ContatoFacadeBean contatoFacade) {
this.contatoFacade = contatoFacade;
}
public Contato getContato() {
return contato;
}
public void setContato(Contato contato) {
this.contato = contato;
}
public List<Contato> getContatos() throws StartupException {
contatos = contatoFacade.buscarTodosContato();
return contatos;
}
//////////////////////////////////Clientes
public ClienteFacadeBean getClienteFacade() {
return clienteFacade;
}
public Cliente getCliente() {
return cliente;
}
public void setCliente(Cliente cliente) {
this.cliente = cliente;
}
public void setClienteFacade(ClienteFacadeBean clienteFacade) {
this.clienteFacade = clienteFacade;
}
public List<Cliente> getClientes() throws StartupException {
clientes = clienteFacade.buscarTodosClientes();
return clientes;
}
public void setClientes(List<Cliente> clientes) {
this.clientes = clientes;
}
}
[/code]
ENTIDADE
[code]package br.com.startup.s3.entidade;
import java.io.Serializable;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.Table;
@Entity
@Table(name="contato")
public class Contato implements Serializable {
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
@Column(name="id_contato")
private Integer idContato;
@Column(name="nome")
private String nome;
@Column(name="email")
private String email;
@ManyToOne(targetEntity = Cliente.class)
@JoinColumn(name="id_cliente")
private Cliente cliente;
/////////////////////////////////////////////////
public Integer getIdContato() {
return idContato;
}
public void setIdContato(Integer idContato) {
this.idContato = idContato;
}
public String getNome() {
return nome;
}
public void setNome(String nome) {
this.nome = nome;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public Cliente getCliente() {
return cliente;
}
public void setCliente(Cliente cliente) {
this.cliente = cliente;
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((cliente == null) ? 0 : cliente.hashCode());
result = prime * result + ((email == null) ? 0 : email.hashCode());
result = prime * result
+ ((idContato == null) ? 0 : idContato.hashCode());
result = prime * result + ((nome == null) ? 0 : nome.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
Contato other = (Contato) obj;
if (cliente == null) {
if (other.cliente != null)
return false;
} else if (!cliente.equals(other.cliente))
return false;
if (email == null) {
if (other.email != null)
return false;
} else if (!email.equals(other.email))
return false;
if (idContato == null) {
if (other.idContato != null)
return false;
} else if (!idContato.equals(other.idContato))
return false;
if (nome == null) {
if (other.nome != null)
return false;
} else if (!nome.equals(other.nome))
return false;
return true;
}
}
Li rapidinho pelo celular mas use converterId= ao invés de converter= que deve funcionar ou mudar o erro, isso é assim pela forma que criou o converter
Está dando o mesmo erro, realmente o meu converter não esta sendo identificado, será que em EJB é diferente?
No caso do converterId você deve colocar apenas o id e não uma referência a este objeto, deve ficar assim:
converterId=“contatoConverter”
Foi assim que você fez?
Também vi que a implementação do converter está bem estranha! Mesmo que com a alteração acima ele comece a encontrar o converter a conversão não deve acontecer corretamente.
A implementação do converter deve em um método receber um objeto e transformar em uma String que você consiga depois fazer a conversão inversa, este objeto é o que você colocar no value do selectOneMenu e também no itemValue do selectItem. No outro método você deve pegar esta String que gerou e conseguir recuperar o objeto novamente que normalmente será uma consulta no banco de dados. Tome cuidado com o selectItem quando está vazio pois o itemValue dele também deve passar sem erros pelo converter.
Mudei o converter não sei se está correto, mas o erro persiste.
Converter
[code]@FacesConverter(value = “contatoConverter”,forClass = Cliente.class)
public class ContatoConverter implements Converter{
@Override
public Object getAsObject(FacesContext context, UIComponent component, String value) {
if (value != null && !value.equals("")) {
try {
Integer id = new Integer(value);
Cliente cliente = new Cliente();
cliente.setIdCliente(id);
return cliente;
} catch (NumberFormatException e) {
throw new ConverterException("Não foi possÃvel obter id Cliente." + value + "." + e.getMessage());
}
}
return null;
}
@Override
public String getAsString(FacesContext context, UIComponent component, Object value) {
if (value instanceof Cliente) {
Cliente cliente = (Cliente) value;
return String.valueOf(cliente.getIdCliente());
}
return "";
}
} [/code]
XHTML
<h:outputText value="Clientes: " />
<p:selectOneMenu value="#{contatoBean.contato.cliente}" effect="fade" converterId="contatoConverter" >
<f:selectItem itemLabel="Selecione..." itemValue="" />
<f:selectItems value="#{contatoBean.clientes}" var="contato" itemLabel="#{contato.nome}" itemValue="#{contato.idCliente}"/>
</p:selectOneMenu>
Note que no itemValue você coloca o id do cliente e no converter você está tentando obter o cliente mas na verdade será apenas o id.
Então vc acha que deve ficar assim? deste jeito da um erro só de acessar o xhtml de id null.
javax.servlet.ServletException: /jsf/FormContato.xhtml @85,142 value="#{contatoBean.contato.cliente.idCliente}": Target Unreachable, 'cliente' returned null
javax.faces.webapp.FacesServlet.service(FacesServlet.java:606)
org.jboss.weld.servlet.ConversationPropagationFilter.doFilter(ConversationPropagationFilter.java:62)
XHTML com o id
<h:outputText value="Clientes: " />
<p:selectOneMenu id="selectTipo" value="#{contatoBean.contato.cliente.idCliente}" effect="fade" converterId="contatoConverter" >
<f:selectItem itemLabel="-Escolha-" itemValue="#" />
<f:selectItems value="#{contatoBean.clientes}" var="contato" itemLabel="#{contato.nome}" itemValue="#{contato.idCliente}"/>
</p:selectOneMenu>
Então vc acha que deve ficar assim? deste jeito da um erro só de acessar o xhtml de id null.
javax.servlet.ServletException: /jsf/FormContato.xhtml @85,142 value="#{contatoBean.contato.cliente.idCliente}": Target Unreachable, 'cliente' returned null
javax.faces.webapp.FacesServlet.service(FacesServlet.java:606)
org.jboss.weld.servlet.ConversationPropagationFilter.doFilter(ConversationPropagationFilter.java:62)
XHTML com o id
<h:outputText value="Clientes: " />
<p:selectOneMenu id="selectTipo" value="#{contatoBean.contato.cliente.idCliente}" effect="fade" converterId="contatoConverter" >
<f:selectItem itemLabel="-Escolha-" itemValue="#" />
<f:selectItems value="#{contatoBean.clientes}" var="contato" itemLabel="#{contato.nome}" itemValue="#{contato.idCliente}"/>
</p:selectOneMenu>
[/quote]
Como vc acha que deve ficar o converter?
Então vc acha que deve ficar assim? deste jeito da um erro só de acessar o xhtml de id null.
javax.servlet.ServletException: /jsf/FormContato.xhtml @85,142 value="#{contatoBean.contato.cliente.idCliente}": Target Unreachable, 'cliente' returned null
javax.faces.webapp.FacesServlet.service(FacesServlet.java:606)
org.jboss.weld.servlet.ConversationPropagationFilter.doFilter(ConversationPropagationFilter.java:62)
XHTML com o id
<h:outputText value="Clientes: " />
<p:selectOneMenu id="selectTipo" value="#{contatoBean.contato.cliente.idCliente}" effect="fade" converterId="contatoConverter" >
<f:selectItem itemLabel="-Escolha-" itemValue="#" />
<f:selectItems value="#{contatoBean.clientes}" var="contato" itemLabel="#{contato.nome}" itemValue="#{contato.idCliente}"/>
</p:selectOneMenu>
[/quote]
Como vc acha que deve ficar o converter?[/quote]
Filipe é verdade, o meu converter não está nem sendo encontrado se eu tiro o [quote]converterId=“contatoConverter”[/quote] do XHTML o erro continua o mesmo
Erro de conversão ao definir o valor '30' para 'null Converter'.
. quer dizer, o converter não está sendo encontrado, não imagino onde está o erro já fiz isto de tantas vezes.
Um jeito simples e que deve funciona é retornar seu converter em um método do seu bean, ou seja:
Você terá um método
public Converter getConverter() {
//retorne uma instância de sua implementação do converter
}
Aí você usa converter="#{meuBean.converter}"
Assim com certeza ele encontrará seu converter.
Para fazer do outro jeito funcionar eu precisaria ver os arquivos de configuração e as dependências.
[quote=FilipeNevola]Um jeito simples e que deve funciona é retornar seu converter em um método do seu bean, ou seja:
Você terá um método
public Converter getConverter() {
//retorne uma instância de sua implementação do converter
}
Aí você usa converter="#{meuBean.converter}"
Assim com certeza ele encontrará seu converter.
Para fazer do outro jeito funcionar eu precisaria ver os arquivos de configuração e as dependências.[/quote]
Filipe, achei o erro e o converter agora está funcionando, o erro agora mudou, e ele pode estar no converter. tipo ele está pegando uma string e não o id. vou te passar o erro
e as novas midificaçoes no xhtml e no converter, quem sabe vc pode me ajudar.
aonde está (“Cliente CLR”) acho que está no lugar do ID
[code]ERRO
15:06:10,875 ERROR [stderr] (http–0.0.0.0-8080-4) java.lang.NumberFormatException: For input string: “Cliente CLR”
15:06:10,878 ERROR [stderr] (http–0.0.0.0-8080-4) at java.lang.NumberFormatException.forInputString(Unknown Source)
15:06:10,881 ERROR [stderr] (http–0.0.0.0-8080-4) at java.lang.Integer.parseInt(Unknown Source)
15:06:10,882 ERROR [stderr] (http–0.0.0.0-8080-4) at java.lang.Integer.parseInt(Unknown Source)
15:06:10,883 ERROR [stderr] (http–0.0.0.0-8080-4) at br.com.startup.s3.util.ContatoConverter.getAsObject(ContatoConverter.java:28)
[/code]
[code]
Converter
@FacesConverter(value=“contatoConverter”)
public class ContatoConverter implements Converter{
@Override
public Object getAsObject(FacesContext context, UIComponent component, String value) throws ConverterException {
if (value != null && !value.equals("")) {
try {
return new ClienteFacadeBean().buscarClientePelaChave(Integer.parseInt(value));
} catch (NumberFormatException | StartupException e) {
e.printStackTrace();
}
}
return null;
}
@Override
public String getAsString(FacesContext context, UIComponent component, Object object) throws ConverterException {
if(object != null && object instanceof Cliente) {
return ((Cliente)object).getIdCliente().toString();
}
return null;
}
} [/code]
XHTML
<h:outputText value="Clientes: " />
<p:selectOneMenu value="#{contatoBean.cliente.idCliente}" effect="fade" converter="contatoConverter">
<f:selectItem itemLabel="Selecione..." itemValue="" noSelectionOption="true"/>
<f:selectItems value="#{contatoBean.clientes}" var="contato" itemLabel="#{contato.nome}" itemValue="#{contato.idCliente}"/>
</p:selectOneMenu>
[quote=jeferson alves][quote=FilipeNevola]Um jeito simples e que deve funciona é retornar seu converter em um método do seu bean, ou seja:
Você terá um método
public Converter getConverter() {
//retorne uma instância de sua implementação do converter
}
Aí você usa converter="#{meuBean.converter}"
Assim com certeza ele encontrará seu converter.
Para fazer do outro jeito funcionar eu precisaria ver os arquivos de configuração e as dependências.[/quote]
Filipe, achei o erro e o converter agora está funcionando, o erro agora mudou, e ele pode estar no converter. tipo ele está pegando uma string e não o id. vou te passar o erro
e as novas midificaçoes no xhtml e no converter, quem sabe vc pode me ajudar.
aonde está (“Cliente CLR”) acho que está no lugar do ID
[code]ERRO
15:06:10,875 ERROR [stderr] (http–0.0.0.0-8080-4) java.lang.NumberFormatException: For input string: “Cliente CLR”
15:06:10,878 ERROR [stderr] (http–0.0.0.0-8080-4) at java.lang.NumberFormatException.forInputString(Unknown Source)
15:06:10,881 ERROR [stderr] (http–0.0.0.0-8080-4) at java.lang.Integer.parseInt(Unknown Source)
15:06:10,882 ERROR [stderr] (http–0.0.0.0-8080-4) at java.lang.Integer.parseInt(Unknown Source)
15:06:10,883 ERROR [stderr] (http–0.0.0.0-8080-4) at br.com.startup.s3.util.ContatoConverter.getAsObject(ContatoConverter.java:28)
[/code]
[code]
Converter
@FacesConverter(value=“contatoConverter”)
public class ContatoConverter implements Converter{
@Override
public Object getAsObject(FacesContext context, UIComponent component, String value) throws ConverterException {
if (value != null && !value.equals("")) {
try {
return new ClienteFacadeBean().buscarClientePelaChave(Integer.parseInt(value));
} catch (NumberFormatException | StartupException e) {
e.printStackTrace();
}
}
return null;
}
@Override
public String getAsString(FacesContext context, UIComponent component, Object object) throws ConverterException {
if(object != null && object instanceof Cliente) {
return ((Cliente)object).getIdCliente().toString();
}
return null;
}
} [/code]
XHTML
<h:outputText value="Clientes: " />
<p:selectOneMenu value="#{contatoBean.cliente.idCliente}" effect="fade" converter="contatoConverter">
<f:selectItem itemLabel="Selecione..." itemValue="" noSelectionOption="true"/>
<f:selectItems value="#{contatoBean.clientes}" var="contato" itemLabel="#{contato.nome}" itemValue="#{contato.idCliente}"/>
</p:selectOneMenu>
[/quote]
O erro do converter está em
no managed bean eu coloco @EJB em ClienteFacadeBean().
coloquei aqui mas não funciona.