Problema com VRaptor3 + DWR [RESOLVIDO]

7 respostas
fabio.cbrandao

Pessoal,

estou com um pequeno problema com vraptor3 + dwr, antes de começar a utilizar o vraptor3 e suas injeções de dependencias o meu método DWR funcionava normalmente e era assim:

public class DWRFacade {

	private final LocalizacaoDAO dao = new LocalizacaoHibernateDAO();
	
	public List<Localizacao> findSimpleLocalizacaoByDescricaoInLatLng(String descricao, Bounds bounds) {
		return dao.findLocalizacaoByDescricaoInLatLng(descricao, bounds);
	}

}

dessa maneira funcionava!!!

depois resolvi incluir as injeções de dependencia na minha classe LocalizacaoHibernateDAO logo ela ganhou um contrutor diferente do default e ficou assim:

@Component
public class LocalizacaoHibernateDAO extends
		GenericoHibernateDAO<Localizacao, Long> implements LocalizacaoDAO {
	
	private final Session session;
	
	public LocalizacaoHibernateDAO(Session session) {
		super(session);
		this.session = session;
	}

	@Override
	@SuppressWarnings("unchecked")
	public List<Localizacao> findLocalizacaoByDescricaoInLatLng(
			String categoria, Bounds bounds) {

		Criteria crit = session.createCriteria(Localizacao.class);
		Criterion cOr = Restrictions.or(
				Restrictions.ilike("nome", "%" + categoria.trim() + "%"), 
				Restrictions.ilike("descricao", "%" + categoria.trim() + "%"));
		Criterion cLat = Restrictions.between("latitude", bounds.getSul().getLatitude(), bounds.getNorte().getLatitude());
		Criterion cLng = Restrictions.between("longitude", bounds.getSul().getLongitude(), bounds.getNorte().getLongitude());
		crit.add(cOr);
		crit.add(cLat);
		crit.add(cLng);
		return crit.list();
	}
}

Agora estou com um problema na minha classe DWRFacade. Como vou fazer para chamar a minha classe LocalizacaoHibernateDAO. Eu até pense em usar a injeção de dependencia do vraptor no meu DWRFacade e acabei fazendo isso:

public class DWRFacade {

	private final LocalizacaoDAO dao;
	
	public DWRFacade(LocalizacaoDAO dao) {
		this.dao = dao;
	}
	
	public List<Localizacao> findSimpleLocalizacaoByDescricaoInLatLng(String descricao, Bounds bounds) {
		return dao.findLocalizacaoByDescricaoInLatLng(descricao, bounds);
	}

}

porém não funciona pois quem chama essa classe DWRFacade é um método javascript e provavelmente ele acaba não encontrado a classe java pelo fato de não encontrar o construtor default. Queria saber se após eu ter adicionado a injeção de dependencia na classe LocalizacaoHibernateDAO tem algum forma de instancia-la em outra classe passando a sessão do hibernate por parametro? E como faço para pegar a sessão do hibernate quando estou usando o provider default do vraptor?

7 Respostas

fabio.cbrandao

Alguém consegue me ajudar???

G

Sim, podemos ajudar. Sei que talvez você tenha pressa, mas lembre-se que todos aqui temos coisas a fazer, e nem sempre dá para responder “just in time”.

Mas enfim, se o DWR precisa de um construtor padrão a coisa complica. O Vraptor exige que os objetos sejam injetados via construtor, então se você usar construtor padrão você não irá conseguir injetar os objetos do vraptor.

Eu não conheço o DWR, e pelo que sei ele não possui integração com o DWR de forma que o DWR controle o ciclo de vida dos objetos. O que você terá de fazer é fazer com que o DWR faça apenas chamadas ao Vraptor via JSON e deixar o Vraptor standalone em relação a ele.

Há um tópico aqui no subfórum de “Frameworks e Bibliotecas brasileiros” que explica bem isso, se você procurar irá achar umas informações sobre isso.

Lucas_Cavalcanti

como o garcia falou, o melhor mesmo é integrar VRaptor e DWR via json/ajax mesmo…

o seu javascript tem que fazer alguma requisição pra sua aplicação pro DWR funcionar, tenta ver como ele faz isso e qual url ele chama…

eu tb nunca mexi com DWR, mas em todo caso posso dar uma olhada e ver como fazer

fabio.cbrandao

Foi mal a pressa garcia, realmente estava desesperado de ter tentado de tudo e nada feito.

Mas então acho q vou acabar trocando o meu framework predileto ajax DWR para usar o jQuery, porém logo de cara já me deparei com algumas diferenças são aqueles famosos erros “bestas” mas que dá um trampo resolver, tenho no meu javascript um método que precisa passar um parametro tipo string para o controller para realizar uma busca:

$.getJSON(contexto + "/buscaJSON/"+sulLatLng.lat()+"/"+sulLatLng.lng()+"/"+norteLatLng.lat()+"/"+norteLatLng.lng()+"", {categoria: "almoço"},
   function(data) {	}
);

meu Controller:

@Resource
public class BuscaController {

	private final Result result;
	private final LocalizacaoDAO dao;
	
	public BuscaController(Result result, LocalizacaoDAO dao) {
		this.result = result;
		this.dao = dao;
	}
	
	@Path("/buscaJSON/{bounds.sul.latitude}/{bounds.sul.longitude}/{bounds.norte.latitude}/{bounds.norte.longitude}")
	public void buscaJSON(Bounds bounds, String categoria) {
		List<Localizacao> locais = dao.findLocalizacaoByDescricaoInLatLng(categoria, bounds);
		result.use(json()).from(locais).serialize();				
	}
}

depois percebi que meu controller retornava uma lista vazia, quando fui ver minha requisição feita pelo jQuery estava enviando a palavra almoço com os caracteres especiais truncados (sem acentos)
Exemplo: almoço

vou dar umas pesquisadas nos charset da minha jsp sempre apanho com os acentos utilizando ajax, cada framework novo q uso para ajax sempre acontece isso…

caso já tenham utilizado o jquery ou souberem de algo agradeço!!!

Lucas_Cavalcanti

vc tem que usar o mesmo encoding em todos os arquivos da sua aplicação, e setar o encoding da requisição para o mesmo encoding…

de qqer forma, se vc mandar só “almoco” é possível que a query do banco seja executada normalmente, como se estivesse com o assento (no mysql funciona, pelo menos)

G

Por padrão eu uso tudo UTF-8, por isso nunca tive problemas. Não sei como o jquery trata o charset, acho que talvez ela pegue pelo charset definido no content-type do html/meta. Como está definido o seu? Nos docs do jquery deve ter algo sobre isso (eu procurei mas não achei). http://api.jquery.com/category/ajax/

Também é necessário saber como está o charset do vraptor. Não sei bem se o padrão é utf-8 :smiley: ou iso-8859-1 :-(, mas dá para você alterar isso para o charset que você quiser. http://vraptor.caelum.com.br/documentacao/configuracoes-avancadas-sobrescrevendo-as-convencoes-e-comportamento-do-vraptor/

<context-param> <param-name>br.com.caelum.vraptor.encoding</param-name> <param-value>UTF-8</param-value> </context-param>

Outro post sobre isso: http://www.guj.com.br/posts/list/198234.java

fabio.cbrandao

Pessoal tópico resolvido.

Solução: caso use o VRaptor trocar o DWR pelo jQuery devido as injections.

Agradeço a ajuda!!! :smiley:

Criado 11 de maio de 2010
Ultima resposta 12 de mai. de 2010
Respostas 7
Participantes 3