Unable to find converter [Resolvido]

16 respostas
robertouba

E ai galera, tudo bem?

Bom, to com o seguinte problema,

<blockquote>br.com.caelum.vraptor.VRaptorException: Unable to find converter for br.com.feinmess.entity.Pesquisa

<a href="http://br.com.caelum.vraptor.core.DefaultConverters.to">br.com.caelum.vraptor.core.DefaultConverters.to</a>(DefaultConverters.java:59)

br.com.caelum.vraptor.http.ognl.VRaptorConvertersAdapter.convert(VRaptorConvertersAdapter.java:59)

br.com.caelum.vraptor.http.ognl.OgnlParametersProvider.convert(OgnlParametersProvider.java:213)

br.com.caelum.vraptor.http.ognl.OgnlParametersProvider.createSimpleParameter(OgnlParametersProvider.java:209)

br.com.caelum.vraptor.http.ognl.OgnlParametersProvider.createParameter(OgnlParametersProvider.java:133)

br.com.caelum.vraptor.http.ognl.OgnlParametersProvider.getParametersFor(OgnlParametersProvider.java:96)

br.com.caelum.vraptor.interceptor.ParametersInstantiatorInterceptor.getParametersFor(ParametersInstantiatorInterceptor.java:107)

br.com.caelum.vraptor.interceptor.ParametersInstantiatorInterceptor.intercept(ParametersInstantiatorInterceptor.java:79)

br.com.caelum.vraptor.core.LazyInterceptorHandler.execute(LazyInterceptorHandler.java:59)

br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54)

br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:56)

br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54)

br.com.caelum.vraptor.interceptor.FlashInterceptor.intercept(FlashInterceptor.java:83)

br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)

br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54)

br.com.caelum.vraptor.interceptor.ExceptionHandlerInterceptor.intercept(ExceptionHandlerInterceptor.java:71)

br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)

br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54)

br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:56)

br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54)

br.com.caelum.vraptor.interceptor.InstantiateInterceptor.intercept(InstantiateInterceptor.java:48)

br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)

br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54)

br.com.caelum.vraptor.interceptor.ResourceLookupInterceptor.intercept(ResourceLookupInterceptor.java:69)

br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)

br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54)

br.com.caelum.vraptor.core.EnhancedRequestExecution.execute(EnhancedRequestExecution.java:23)

br.com.caelum.vraptor.VRaptor$1.insideRequest(VRaptor.java:92)

br.com.caelum.vraptor.ioc.spring.SpringProvider.provideForRequest(SpringProvider.java:58)

br.com.caelum.vraptor.VRaptor.doFilter(VRaptor.java:89)</blockquote>

Minhas classes estão tudo ok, seguindo os mesmos padrões de sempre… Mas, realmente não sei…

@Entity
@Table(name = "Pesquisa")
public class Pesquisa {

	private String instrumento;
	private String pesquisa;
	private String certificado;
	private String descricao;
	private String calibracao1;
	private String calibracao2;
	private String proxcalibracao1;
	private String proxcalibracao2;
	private String aprovacao1;
	private String aprovacao2;
@Restrito
	@Post
	@Path("/calibra/")
	public void index(Pesquisa pesquisa) {
		//result.include("pesquisa",pesquisa.getPesquisa());
		System.out.println("ENTREI EM PESQUISA");
	}

Vi alguma coisa sobre o converter, mas, em 6 websistemas que tenho em Vraptor, nunca tive esse erro! achei um pouco bizarro!

16 Respostas

Lucas_Cavalcanti

Unable to find converter for br.com.feinmess.entity.Pesquisa

falta o converter para essa classe.

vc provavelmente está passando na requisição um parâmetro chamado pesquisa, daí o VRaptor tenta converter o value desse parâmetro pra Pesquisa.

se a intenção é passar o id, então use pesquisa.id como parâmetro

robertouba

kkkk fiquei 3 horas na frente do PC tentando fazer cada coisa!

Realmente era isso, nunca tinha me atendado que nunca fiz um parametro com nome da classe.

J
Lucas Cavalcanti:
Unable to find converter for br.com.feinmess.entity.Pesquisa falta o converter para essa classe. vc provavelmente está passando na requisição um parâmetro chamado pesquisa, daí o VRaptor tenta converter o value desse parâmetro pra Pesquisa. se a intenção é passar o id, então use pesquisa.id como parâmetro

Estou com um problema semelhante, mas não sei como fazer esse tipo de conversão.

Seguindo suas dicas em [url]http://www.guj.com.br/java/235513-select-multiple-no-vraptor-312[/url], implementei um SELECT MULTIPLE no meu novalinhadepesquisa.jsp, que recebe do método novalinhadepesquisa do LinhaPesquisaController.java a lista todosprojetos de Projeto.java:

public void novalinhadepesquisa() {
        result.include("linhasdepesquisa", dao.list());
        result.include("todosprojetos", pdao.list());
    }

Minha ideia era preencher a lista de projetos do meu bean LinhaPesquisa :

public class LinhaPesquisa {    
	private Long idPesquisa;	
	private String nome;
	
	private List<Projeto> projetos = new ArrayList<Projeto>();
	private LinhaPesquisa subLinha;
	private List<RelacaoPesquisa> relacoes = new ArrayList<RelacaoPesquisa>();
        ... 
        getters e setters
}

... instanciado no .jsp como linhapesquisa, usando SELECT MULTIPLE:

<form method="post" action="/SIGP/linhadepesquisa/inserir">
	<table>
		<tr>
			<td>Nome:</td>
			<td><input type="text" name="linhapesquisa.nome" />
			</td>
		</tr>


               <tr>
                    <td>Projetos</td>
                       <td><select name="linhapesquisa.projetos[]" size="3" multiple>
                           <option value="0">Nenhum</option>
                           <c:forEach items="${todosprojetos}" var="projeto">
                                 <option value="${projeto}">${projeto.nome}</option>
                           </c:forEach>
                              </select></td>
               </tr>

Imagino que linhapesquisa.projetos[] seja uma lista contendo referências para objetos da classe Projeto. Corrijam-me se eu tiver entendendo errado.
Esse .jsp chama o método inserir() do LinhaPesquisaController, passando linhapesquisa como parâmetro:

@Path("/linhadepesquisa/inserir")   
    public void inserir(final LinhaPesquisa linhapesquisa){  
        validator.validate(linhapesquisa);
        validator.onErrorForwardTo(this).novalinhadepesquisa();
        dao.save(linhapesquisa);
        result.redirectTo(this).index();
    }

Eu esperava que INSERIR recebesse o objeto linhapesquisa pronto para ser validado e inserido no BD, mas o VRaptor reclama com o erro:
Unable to find converter for sigp.src.Projeto

obs: também já tentei usar uma lista de idProjeto (em vez de uma lista de objetos Projeto propriamente) com o SELECT, receber essa lista no controller e preencher a lista de projetos do bean LinhaPesquisa na mão, isto é, criando uma List projetos, acessando os objetos Projeto via dao com idProjeto, adicionando-os à lista criada e depois fazendo linhapesquisa.setProjetos(projetos), mas aí recebo um erro de entrada duplicada de idProjeto no BD.

Qualquer dica será bem vinda!

Abç

JLeandro

Lucas_Cavalcanti

vc não consegue ligar o valor ao projeto direto, a menos que vc crie um converter pra ele, daí o problema do converter.

faça pelo id:

<select name="linhapesquisa.projetos[].id" size="3" multiple>  
                           <option value="0">Nenhum</option>  
                           <c:forEach items="${todosprojetos}" var="projeto">  
                                 <option value="${projeto.id}">${projeto.nome}</option>  
                           </c:forEach>  
                              </select>
J
Lucas Cavalcanti:
vc não consegue ligar o valor ao projeto direto, a menos que vc crie um converter pra ele, daí o problema do converter.

faça pelo id:

<select name="linhapesquisa.projetos[].id" size="3" multiple>  
                           <option value="0">Nenhum</option>  
                           <c:forEach items="${todosprojetos}" var="projeto">  
                                 <option value="${projeto.id}">${projeto.nome}</option>  
                           </c:forEach>  
                              </select>

Oi, Lucas

Valeu mesmo! Deu certo.
Só pra registrar aqui para outros interessados, eu já havia tentado isto, mas não tinha me tocado que o que JSP devolve são Strings para o Action Method (ou lista deles, no meu caso) e não o tipo do objeto que vc espera.
Fiz como vc sugeriu acima, recebi no Action Method a lista de IDs, carreguei os projetos do BD com eles e preenchi os atributos do meu objeto listapesquisa no Controller:

@Path("/linhadepesquisa/inserir")   
    public void inserir(final LinhaPesquisa linhapesquisa, final List<Long> idsProjetos, final String subLinhaidPesquisa){ 
List<Projeto> projetos = new ArrayList<Projeto>();
    	for (int i = 0; i < idsProjetos.size(); i++){
    		projetos.add(pdao.getProjeto(idsProjetos.get(i)));
    	}
    	linhapesquisa.setProjetos(projetos);
    	
    	if (subLinhaidPesquisa.equals("null"))
    		linhapesquisa.setSubLinha(null);    	
    	else
    		linhapesquisa.setSubLinha(dao.getLinhaPesquisa(Long.parseLong(subLinhaidPesquisa)));
    	
        validator.validate(linhapesquisa);
        validator.onErrorForwardTo(this).novalinhadepesquisa();
        dao.save(linhapesquisa);
        result.redirectTo(this).index();
    }

Não sei porque eu havia subentendido que o JSP preenche os atributos do seu objeto, desde que se use a notação "variavel.atributo"; acho que foi isto que me confundiu. Tenho a impressão de ter lido algo assim na apostila da Caelum. Disto, subentendi que dentro do JSP, poderíamos acessar qualquer atributo (ou lista de) do objeto em questão usando o operador ponto.

p.s.: tenho usado muito esse fórum, como newbie de programação Java para Web, e já percebi que vc domina o assunto, respondendo em vários tópicos.
Parabéns pelo trabalho.

Abç

JLeandro

Lucas_Cavalcanti

essa notacao variavel.atributo eh uma convencao do vraptor, nao uma funcionalidade do jsp.

varios outros frameworks usam essa convencao.

S

Cara estou com o mesmo problema:
br.com.caelum.vraptor.VRaptorException: Unable to find converter for br.com.aberta.tzion.util.FiltroProcura
br.com.caelum.vraptor.core.DefaultConverters.to(DefaultConverters.java:59)

Na verdade eu criei um converter que resolveu isto pra mim mas pesquisando na net vi que o VRaptor já tem um JsonDeserializer, mas não estou conseguindo usar
já coloquei o content-type pra Application/Json, já importei a jettison-1.3.jar,
alguém pode me dar uma luz?
Valeu, desde já, Obrigado.

Lucas_Cavalcanti

o content type precisa ser application/json (não lembro se precisa ser minúscula), e o método do controller precisa estar anotado com @Consumes(“application/json”)

S

Coloquei a anotação mas continua não dando certo, segue abaixo mais informações:

Parâmetros enviados pelo navegador:

_dc	1324053775324
filtroProcura	{"campo":"descricao","operador":"TEXTO%","tipo":"string","valor":"sandro"}
limit	25
page	1
start	0

Classe FiltroProcura.java:

package br.com.aberta.tzion.util;

public class FiltroProcura{
//public class FiltroProcura implements Jsonable{
	private String campo;
	private String operador;
	private String tipo;
	private String valor;
	
	public String getCampo() {
		return campo;
	}
	public void setCampo(String campo) {
		this.campo = campo;
	}
	public String getOperador() {
		return operador;
	}
	public void setOperador(String operador) {
		this.operador = operador;
	}
	public String getTipo() {
		return tipo;
	}
	public void setTipo(String tipo) {
		this.tipo = tipo;
	}
	public String getValor() {
		return valor;
	}
	public void setValor(String valor) {
		this.valor = valor;
	}
}

Cabecalhos:

Cabeçalhos de Resposta
Server	Apache-Coyote/1.1
Content-Type	text/html;charset=utf-8
Content-Length	4090
Date	Fri, 16 Dec 2011 16:42:56 GMT
Connection	close

Cabeçalhos de Solicitação
Host	localhost:8080
User-Agent	Mozilla/5.0 (Windows; U; Windows NT 6.1; pt-BR; rv:1.9.2.24) Gecko/20111103 Firefox/3.6.24
Accept	text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language	pt-br,pt;q=0.8,en-us;q=0.5,en;q=0.3
Accept-Encoding	gzip,deflate
Accept-Charset	ISO-8859-1,utf-8;q=0.7,*;q=0.7
Keep-Alive	115
Connection	keep-alive
Content-Type	application/json
X-Requested-With	XMLHttpRequest
Referer	http://localhost:8080/tzion/

Classe CategoriaController.class:

package br.com.aberta.tzion.controller;

import java.util.List;

import br.com.aberta.tzion.dao.CategoriaDao;
import br.com.aberta.tzion.entity.Categoria;
import br.com.aberta.tzion.util.FiltroProcura;

import br.com.caelum.vraptor.Consumes;
import br.com.caelum.vraptor.Get;
import br.com.caelum.vraptor.Path;
import br.com.caelum.vraptor.Resource;
import br.com.caelum.vraptor.Result;
import br.com.caelum.vraptor.util.extjs.ExtJSJson;

@Resource
public class CategoriaController { 
	private final Result result;
	private final CategoriaDao dao;
	
	public CategoriaController(Result result, CategoriaDao dao) {
		this.result = result;
		this.dao = dao;
	}

	@Consumes("application/json")
	@Get @Path("/categoria")
	public void listaTudo(FiltroProcura filtroProcura) {
//	public void listaTudo() {
		List<Categoria> listacategoria = dao.getListaGeral(); //aqui trocarei por um método que recebera filtroProcura como parâmetro  
		 result.use(ExtJSJson.class).from(listacategoria).success(listacategoria != null).serialize();
	}	
}

vou seguir fazendo mais testes aqui…

valeu, Obrigado.

Lucas_Cavalcanti

o problema é que vc não está passando uma requisição em json, vc tá passando form parameters, em que um dos parâmetros é um json.

o consumes não vai funcionar aqui mesmo, vc vai precisar do converter mesmo, infelizmente… ou enviar um json de verdade na requisição.

S

Lucas Cavalcanti:
o problema é que vc não está passando uma requisição em json, vc tá passando form parameters, em que um dos parâmetros é um json.

o consumes não vai funcionar aqui mesmo, vc vai precisar do converter mesmo, infelizmente… ou enviar um json de verdade na requisição.

Valeu Lucas Obrigado pela força…

salmaox

Boa tarde,

Gostaria de reativar esse tópico pois estou com o mesmo problema e não consigo resolver.

br.com.caelum.vraptor.VRaptorException: Unable to find converter for br.gov.cemaden.bean.Versao

VersaoController

@Post
	@Path("/versao/visualiza")
	public void visualiza(String vigencia, String atualizacao, List<String> mun,
			List<String> local, Long[] nivelSel, Versao versao) {
		
		 System.out.println("descricao: "+versao.getDescricao());
	
		/* Header do Alerta */
		 this.result.include("idalerta", dao.retornaSequenceAlerta());
		 this.result.include("atualizacao", atualizacao);
		 this.result.include("data", fd.getdatahora());
		 this.result.include("vigencia", vigencia);
		 this.result.include("versao", versao);
		 .....

novo.jsp

<form name="form" id="form" action="<c:url value="/versao/visualiza"/>" method="post" class="form" style="width: 675px;" >
<div id="tabs-a" align="justify">
   <textarea name="versao.descricao" id="" cols="44" rows="3"></textarea>
</div>
<div id="tabs-b" align="justify">
   <textarea name="versao.observacao" id="" cols="44" rows="3"></textarea>
</div>
<div id="tabs-c" align="justify">
   <textarea name="versao.retroanalise" id="" cols="44" rows="3"></textarea>
</div>
<div id="tabs-d" align="justify">
   <textarea name="versao.discussao" id="" cols="44" rows="3"></textarea>
</div>
</form>

visualiza.jsp

<div>
	<p>Descrição:</p> 
	<p>${versao.descricao}</p>
</div>

<div>
	<p>Discussão: </p> 
	<p>${versao.discussao}</p>
</div>

<div>
	<p>Retroanálise: </p>
	<p>${versao.retroanalise}</p>
</div>

<div>
	<p>Observação: </p>
	<p>${versao.observacao}</p>
</div>

Muito obrigado

Lucas_Cavalcanti

isso acontece se tiver algum parâmetro no request que termina em uma Versao.

dá uma olhada no firebug, por exemplo, e veja quais são os parâmetros passados. Ou ative o log de debug do vraptor e veja se aparece algo no log.

salmaox

Resolvido

Criei um converter seguindo a documentação do VRAPTOR.

@Convert(Versao.class)
@ApplicationScoped
public class VersaoConverter implements Converter<Versao> {

    public Versao convert(String value, Class<? extends Versao> type, ResourceBundle bundle) {
        if (value == null || value.equals("")) {
            return null;
        }
        try {
            return new Versao();
        } catch (NumberFormatException e) {
                    throw new ConversionError(MessageFormat.format(bundle.getString("is_not_a_valid_integer"), value));
        }
    }
}
salmaox

Lucas,

No entanto ainda fiquei sem entender o porquê de utilizar o converter…Pois já utilizei em diversas outros controllers parâmetros como: Gerente gerente, Operador operador, etc

E se eu quiser fazer passar como parâmetros mais Entidades, teria que criar um converter pra cada? Poderia criar um genérico?

Abraços

Lucas_Cavalcanti

não é pra criar o converter, é pra ver se tem algum parâmetro da requisição que termina no cara que deu pau…

Por exemplo, existe algum input com:

<input name="versao" ... />

?

Criado 15 de agosto de 2011
Ultima resposta 2 de mai. de 2012
Respostas 16
Participantes 5