Re:Consulta Simple JPQL [RESOLVIDO]

Ola Pessoal,

Tenho uma consulta vem JPQL muito simple mas não funciona por causa de um Cast que estou fazendo para String, não sei porque isso está acontecendo, já fiz isso em outras consultas e funciona direitinho.

Estou usando o Vraptor e criei um Interceptor para quando acessar um URI que tenha no banco seja interceptada e redirecionada para um template do usuário, se casa tenha a URI manda para o Template se não pode fazer qualquer coisa erro 403 sei lá.

Alguém poderia me dizer porque não posso fazer esse Cast?

Obrigado!



@Intercepts @RequestScoped
public class InterceptorURI implements Interceptor {
	
	private final UsuarioController usuarioController;
	private HttpServletRequest request;
	
	public InterceptorURI(UsuarioController usuarioController, HttpServletRequest request){
		this.usuarioController  = usuarioController;
		this.request 			= request;
	}
	
	
	@Override
	public boolean accepts(ResourceMethod method) {
		String uri = request.getRequestURI().replaceFirst(request.getContextPath(), "");
	
		String buscaURI = usuarioController.BuscaURI(uri);
		
		if(uri == buscaURI){
			System.out.println("************ URI válida *************");
			return true;
		}
		
		System.out.println("********** URI Invalida *************");
		return false;
	}

	@Override
	public void intercept(InterceptorStack stack, ResourceMethod method,
			Object resourceInstance) throws InterceptionException {
		
		System.out.println("***************Interceptando "+ request.getRequestURI());
		
		stack.next(method, resourceInstance);
			
	}

}


// DAO


public String buscaURI(String uri) {
		
		try {
			String jpql = "select u from Usuario u where u.uri = :uri";
			Query query = this.em.createQuery(jpql);
			query.setParameter("uri", uri);
			return (String) query.getSingleResult();
			
		} catch (NoResultException e) {
			return null;
		}
		
	}

ERRO


go 30, 2012 3:56:39 PM org.apache.catalina.core.StandardWrapperValve invoke
Grave: Servlet.service() for servlet default threw exception
java.lang.ClassCastException: br.com.meusite.admin.model.Usuario cannot be cast to java.lang.String
	at br.com.meusite.admin.dao.UsuarioDAO.buscaURI(UsuarioDAO.java:55)
	at br.com.meusite.admin.controller.UsuarioController.BuscaURI(UsuarioController.java:195)
	at br.com.meusite.interceptor.InterceptorURI.accepts(InterceptorURI.java:31)
	at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:52)
	at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54)
	at br.com.caelum.vraptor.interceptor.FlashInterceptor.intercept(FlashInterceptor.java:83)
	at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
	at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54)
	at br.com.caelum.vraptor.interceptor.ExceptionHandlerInterceptor.intercept(ExceptionHandlerInterceptor.java:71)
	at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
	at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54)
	at br.com.caelum.vraptor.interceptor.InstantiateInterceptor.intercept(InstantiateInterceptor.java:48)
	at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
	at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54)
	at br.com.caelum.vraptor.interceptor.ResourceLookupInterceptor.intercept(ResourceLookupInterceptor.java:69)
	at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
	at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54)
	at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:56)
	at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54)
	at br.com.caelum.vraptor.core.EnhancedRequestExecution.execute(EnhancedRequestExecution.java:44)
	at br.com.caelum.vraptor.VRaptor$1.insideRequest(VRaptor.java:92)
	at br.com.caelum.vraptor.ioc.spring.SpringProvider.provideForRequest(SpringProvider.java:58)
	at br.com.caelum.vraptor.VRaptor.doFilter(VRaptor.java:89)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:293)
	at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:859)
	at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:602)
	at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:489)
	at java.lang.Thread.run(Unknown Source)

Serio que você ta querendo converter um Usuário para String?

Olhando pelo principio Java apenas, esquece hibernate, isso é possível?

Se você quer chamar o toString do Usuario e retornar? Se sim, você tem que usar outro modo.

Então jakefrog,

Não entendi :oops:

O que eu queria era retornar uma String no meu DAO, já que eu quero só a uri que está no meu banco, não precisava retornar um Usuário populado e etc.

Antes tinha feito passando um usuário e reornando um e na hora de comparar eu usava o equals


buscaURI.equals(uri)

Mas ai eu cai em outro problema que foi a minha anotação do metodo que chama o template.


public class ModeloController {
	
	@Get @Path("/{usuario.uri}")
	public void modelo(){}

}

Desse jeito ele vai querer interceptar todas as uri e quando não for uma que está no banco mas ela existe como por exemplo o /login da erro.

E achei que se retorna-se um String não preciso mudar a uri por exemplo site/meusite

Não quero esse site ou qualquer coisa ali.

Não sei o que eu faço.



Ago 30, 2012 4:08:12 PM org.apache.catalina.core.StandardWrapperValve invoke
Grave: Servlet.service() for servlet default threw exception
java.lang.IllegalStateException: There are two rules that matches the uri '/login' with method GET: [[FixedMethodStrategy: /{usuario.uri}                                                    ModeloController.modelo()                                              [GET]], [FixedMethodStrategy: /login                                                            UsuarioController.login()                                              [GET]]] with same priority. Consider using @Path priority attribute.
	at br.com.caelum.vraptor.http.route.DefaultRouter.checkIfThereIsAnotherRoute(DefaultRouter.java:97)
	at br.com.caelum.vraptor.http.route.DefaultRouter.parse(DefaultRouter.java:88)
	at br.com.caelum.vraptor.http.DefaultResourceTranslator.translate(DefaultResourceTranslator.java:59)
	at br.com.caelum.vraptor.interceptor.ResourceLookupInterceptor.intercept(ResourceLookupInterceptor.java:66)
	at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
	at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54)
	at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:56)
	at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54)
	at br.com.caelum.vraptor.core.EnhancedRequestExecution.execute(EnhancedRequestExecution.java:44)
	at br.com.caelum.vraptor.VRaptor$1.insideRequest(VRaptor.java:92)
	at br.com.caelum.vraptor.ioc.spring.SpringProvider.provideForRequest(SpringProvider.java:58)
	at br.com.caelum.vraptor.VRaptor.doFilter(VRaptor.java:89)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:293)
	at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:859)
	at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:602)
	at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:489)
	at java.lang.Thread.run(Unknown Source)

Bom pessoal,

Resolvido, deixei o objeto como Usuário mesmo e modifiquei os @Path do meu projeto.

Abraços!