Web Service: RESTEasy + Hibernate

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:

[code]@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);
}

[/code]
Quando eu faço a chamadas…

http://localhost:8080/resteasy/myrest/status
http://localhost:8080/resteasy/myrest/hello/Sergio

… recebo as respostas:

Mas quando chamo…

http://localhost:8080/resteasy/myrest/persons/3

… recebo o erro:

[quote]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[/quote]

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

Alguém pode ajudar?

Agradeço antecipadamente!

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.

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

[code]@Path("/")
public class ShoppingStore {

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

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

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: