Unable to find converter [Resolvido]

16 respostas
R

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

L

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

R

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

L

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

L

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.

L

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.

L

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…

S

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

L

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.

S

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));
        }
    }
}
S

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

L

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