Web Service: RESTEasy + Hibernate

4 respostas
S

Olá pessoal,

estou com um problema no meu serviço que usa RESTEasy + Hibernate.
Consigo utilizar meus serviços mais simples normalmente, mas quando faço chamadas a métodos que fazem persistência, recebo um erro no Tomcat.

Segue um trecho do código do serviço:
@ProduceMime("text/plain")
@Path("/myrest/")
public class PersonREST{

	@GET
	@Path("/status/")
	public String status() {
		return "OK!";
	}
        
    @GET
	@Path("/hello/{name}")
	public String helloMr(@PathParam("name")String name) {
		return "Hello Mr. " + name;
	}

    /**
	 * FIXME: Don't work!
	*/
	@GET
	@Path("/persons/{id}")
	public Person findPerson(@PathParam("id")Long id) {
		PersonService personService = new PersonServiceImpl(); 

		return personService.procura(id);
	}
Quando eu faço a chamadas..
http://localhost:8080/resteasy/myrest/status
http://localhost:8080/resteasy/myrest/hello/Sergio
... recebo as respostas:
OK!!
Hello Mr. Sergio
Mas quando chamo...
http://localhost:8080/resteasy/myrest/persons/3
... recebo o erro:
INFO: Starting Coyote HTTP/1.1 on http-8080 03/10/2008 12:29:43 org.apache.jk.common.ChannelSocket init INFO: JK: ajp13 listening on /0.0.0.0:8009 03/10/2008 12:29:44 org.apache.jk.server.JkMain start INFO: Jk running ID=0 time=0/77 config=null 03/10/2008 12:29:44 org.apache.catalina.startup.Catalina start INFO: Server startup in 9504 ms log4j:WARN No appenders could be found for logger (org.hibernate.cfg.annotations.Version). log4j:WARN Please initialize the log4j system properly. java.lang.RuntimeException: Failed processing public com.restful.resteasy.bo.Person com.restful.resteasy.restservice.PersonREST.findPerson(java.lang.Long) at org.resteasy.MethodInjectorImpl.invoke(MethodInjectorImpl.java:109) at org.resteasy.ResourceMethod.invoke(ResourceMethod.java:162) at org.resteasy.ResourceMethod.invoke(ResourceMethod.java:134) at org.resteasy.Dispatcher.invoke(Dispatcher.java:161) at org.resteasy.plugins.server.servlet.HttpServletDispatcher.service(HttpServletDispatcher.java:138) at org.resteasy.plugins.server.servlet.HttpServletDispatcher.service(HttpServletDispatcher.java:77) at javax.servlet.http.HttpServlet.service(HttpServlet.java:717) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290) 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:128) 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:286) at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:845) at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:583) at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:447) at java.lang.Thread.run(Thread.java:619) Caused by: java.lang.ExceptionInInitializerError at com.restful.resteasy.dao.DaoFactory.<init>(DaoFactory.java:13) at com.restful.resteasy.service.PersonServiceImpl.<init>(PersonServiceImpl.java:14) at com.restful.resteasy.restservice.PersonREST.findPerson(PersonREST.java:47) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) at java.lang.reflect.Method.invoke(Method.java:597) at org.resteasy.MethodInjectorImpl.invoke(MethodInjectorImpl.java:72) ... 18 more Caused by: org.hibernate.HibernateException: Hibernate Dialect must be explicitly set at org.hibernate.dialect.DialectFactory.determineDialect(DialectFactory.java:80) at org.hibernate.dialect.DialectFactory.buildDialect(DialectFactory.java:62) at org.hibernate.cfg.SettingsFactory.determineDialect(SettingsFactory.java:460) at org.hibernate.cfg.SettingsFactory.buildSettings(SettingsFactory.java:155) at org.hibernate.cfg.Configuration.buildSettings(Configuration.java:2101) at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1325) at org.hibernate.cfg.AnnotationConfiguration.buildSessionFactory(AnnotationConfiguration.java:867) at com.restful.resteasy.dao.HibernateSessionFactory.<clinit>(HibernateSessionFactory.java:17) ... 26 more

A camada de persistência funciona perfeitamente sem o uso de REST.

Alguém pode ajudar?

Agradeço antecipadamente!

4 Respostas

R

O problema tá na sua compreensão do conceito de REST.

Tenha sempre,eu disse “SEMPRE”, em mente que REST é HTTP puro e simples.

Tendo dito isso, como você espera retornar um objeto Person no método ‘findPerson’? Como você espera mapear o objeto Person no protocolo HTTP?

Retorne esse objeto em outro formato: XML, JSON, InputStream, etc.

S

Tomei como base este código, não atentando para este detalhe:

@Path("/")
public class ShoppingStore {

   @Path("/customers/{id}")
   public Customer getCustomer(@PathParam("id") int id) {
      Customer cust = ...; // Find a customer object
      return cust;
   }
}
Fonte: http://wiki.jboss.org/wiki/JAXRSResourceLocators
R

Só para esclarecer, a forma de retornar um objeto via serviço REST varia de framework para framework, pois não é definido isso na especificação da JSR 311.

Eu particularmente sempre evito fazer isso, dando preferência a retornar XML, JSON, InputStream, etc.

Rafael Nunes

F

Tu já testou a tua persistencia diretamente? Um teste unitário?

Olha a msg de erro na tua exception

Caused by: org.hibernate.HibernateException: Hibernate Dialect must be explicitly set

Ou seja, não está configurado o dialeto do banco :wink:

Criado 3 de outubro de 2008
Ultima resposta 20 de out. de 2008
Respostas 4
Participantes 3