users@jersey.java.net

Re: [Jersey] Jersey + Hibernate/JPA error

From: Paul Sandoz <Paul.Sandoz_at_Sun.COM>
Date: Fri, 09 Oct 2009 09:00:52 +0200

Hi Ron,

The problem is that by default Jersey does not currently support
injection of EE resources. This will be fixed with the release of
GlassFish v3 in November.

In the interim it is possible to use the
com.sun.jersey.server.impl.container.servlet.ServletAdaptor or use
Jersey's injection mechanism in the interim. I have attached the
source below if you want to copy the source and extend from
ServletContainer (the public API) instead.

Paul.

package com.sun.jersey.server.impl.container.servlet;

import com.sun.jersey.api.container.ContainerException;
import com.sun.jersey.api.core.ResourceConfig;
import com.sun.jersey.spi.container.WebApplication;
import com.sun.jersey.spi.container.servlet.ServletContainer;
import com.sun.jersey.spi.inject.Injectable;
import com.sun.jersey.spi.inject.InjectableProvider;
import com.sun.jersey.core.spi.component.ComponentContext;
import com.sun.jersey.core.spi.component.ComponentScope;
import java.lang.reflect.Proxy;
import java.lang.reflect.Type;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.Map;
import javax.persistence.EntityManagerFactory;
import javax.persistence.PersistenceUnit;
import javax.servlet.ServletConfig;

/**
  * A servlet container for deploying root resource classes with support
  * for injecting persistence units.
  * <p>
  * Persistence units that may be injected must be configured in web.xml
  * in the normal way plus an additional servlet parameter to enable the
  * Jersey servlet to locate them in JNDI. E.g. with the following
  * persistence unit configuration:
  *
  * <persistence-unit-ref>
  * <persistence-unit-ref-name>persistence/widget</persistence-
unit-ref-name>
  * <persistence-unit-name>WidgetPU</persistence-unit-name>
  * </persistence-unit-ref>
  *
  * the Jersey servlet requires an additional servlet parameter as
  * follows:
  *
  * <init-param>
  * <param-name>unit:WidgetPU</param-name>
  * <param-value>persistence/widget</param-value>
  * </init-param>
  *
  * Given the above, Jersey will inject the EntityManagerFactory found
  * at java:comp/env/persistence/widget in JNDI when encountering a
  * field or parameter annotated with
@PersistenceUnit(unitName="WidgetPU").
  */
public class ServletAdaptor extends ServletContainer {
     private Map<String, String> persistenceUnits =
             new HashMap<String, String>();

     @Override
     protected void configure(ServletConfig servletConfig,
ResourceConfig rc, WebApplication wa) {
         super.configure(servletConfig, rc, wa);

         /**
          * Look for persistent units.
          */
         for (Enumeration e = servletConfig.getInitParameterNames() ;
e.hasMoreElements() ;) {
             String key = (String)e.nextElement();
             String value = servletConfig.getInitParameter(key);
             if (key.startsWith("unit:")) {
                 persistenceUnits.put(key.substring(5),"java:comp/
env/"+value);
             }
         }

         rc.getSingletons().add(new
InjectableProvider<PersistenceUnit, Type>() {
             public ComponentScope getScope() {
                 return ComponentScope.Singleton;
             }

             public Injectable<EntityManagerFactory>
getInjectable(ComponentContext ic, PersistenceUnit pu, Type c) {
                 if (!c.equals(EntityManagerFactory.class))
                     return null;

                 // TODO localize error message
                 if (!persistenceUnits.containsKey(pu.unitName()))
                     throw new ContainerException("Persistence unit '"+
                             pu.unitName()+
                             "' is not configured as a servlet
parameter in web.xml");
                 String jndiName = persistenceUnits.get(pu.unitName());
                 ThreadLocalNamedInvoker<EntityManagerFactory>
emfHandler =
                         new
ThreadLocalNamedInvoker<EntityManagerFactory>(jndiName);
                 final EntityManagerFactory emf =
(EntityManagerFactory) Proxy.newProxyInstance(
                         this.getClass().getClassLoader(),
                         new Class[] { EntityManagerFactory.class },
                         emfHandler);

                 return new Injectable<EntityManagerFactory>() {
                     public EntityManagerFactory getValue() {
                         return emf;
                     }
                 };
             }
         });
     }
}


On Oct 9, 2009, at 2:42 AM, Roan Brasil Monteiro wrote:

> Hello ,
>
>
> I'd installed Glassfishv2.1 and configured to connect to Mysql in
> Resources and JNDI. After that I created on my eclipse using
> maven2eclipse plugin a jersey-quickstart-webapp archetype . I
> downloaded the org.hibernate libs (hibernate-core, hibernate-
> annotations, hibernate-entitymanger...) . I created a folder META-
> INF inside of src/main/resources and inside of META-INF my
> persistence.xml . I didn't put information like pass, user and url
> because I configured that on Glassfish. When I am running the
> glassfish with my project its running very well without hibernate/
> jpa. When I am running with it I am getting:
> I dont know what to do more how to fix it. I read the Paul answer
> but I couldn't resolve it.
> If anyone can help me, please let me know. How can I answer this
> topi?c-> https://jersey.dev.java.net/servlets/ReadMsg?list=users&msgNo=8029&raw=true
> NullPointerException
>
> @PersistenceUnit(name = "citespace-jpa")
> protected EntityManagerFactory emf;
>
> @GET
> @Produces("text/plain")
> public String getIt() {
>
> line 29--> EntityManager manager = emf.createEntityManager();
> Query q = manager.createQuery("SELECT c from Country c
> where c.id= :id ");
> q.setParameter("id", 1);
> List<Country> c = q.getResultList();
> .
> .
> .
> [#|2009-10-08T16:39:59.524-0300|SEVERE|sun-appserver2.1|
> com.sun.jersey.server.impl.application.WebApplicationImpl|
> _ThreadID
> =19;_ThreadName=httpSSLWorkerThread-8080-0;_RequestID=52a5f523-
> f63f-4473-8f43-fa33a831d784;|The RuntimeException could not be
> mapped to a response, re-throwing to the HTTP container
> java.lang.NullPointerException
> at com.citespace.citespacerest.Test.getIt(Test.java:29)
> 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
> com
> .sun
> .jersey
> .server
> .impl.model.method.dispatch.AbstractResourceMethodDispatchProvider
> $
> TypeOutInvoker._dispatch(AbstractResourceMethodDispatchProvider.java:
> 156)
> at
> com
> .sun
> .jersey
> .server
> .impl
> .model
> .method
> .dispatch
> .ResourceJavaMethodDispatcher
> .dispatch(ResourceJavaMethodDispatcher.java:67)
> at
> com
> .sun
> .jersey
> .server.impl.uri.rules.HttpMethodRule.accept(HttpMethodRule.java:208)
> at
> com
> .sun
> .jersey
> .server
> .impl.uri.rules.ResourceClassRule.accept(ResourceClassRule.java:75)
> at
> com
> .sun
> .jersey
> .server
> .impl.uri.rules.RightHandPathRule.accept(RightHandPathRule.java:115)
> at
> com
> .sun
> .jersey
> .server
> .impl
> .uri
> .rules.RootResourceClassesRule.accept(RootResourceClassesRule.java:67)
> at
> com
> .sun
> .jersey
> .server
> .impl
> .application
> .WebApplicationImpl._handleRequest(WebApplicationImpl.java:746)
> at
> com
> .sun
> .jersey
> .server
> .impl
> .application
> .WebApplicationImpl.handleRequest(WebApplicationImpl.java:711)
> at
> com
> .sun
> .jersey
> .server
> .impl
> .application
> .WebApplicationImpl.handleRequest(WebApplicationImpl.java:702)
> at
> com
> .sun
> .jersey.spi.container.servlet.WebComponent.service(WebComponent.java:
> 340)
> at
> com
> .sun
> .jersey
> .spi
> .container.servlet.ServletContainer.service(ServletContainer.java:452)
> at
> com
> .sun
> .jersey
> .spi
> .container.servlet.ServletContainer.service(ServletContainer.java:633)
> at javax.servlet.http.HttpServlet.service(HttpServlet.java:847)
> at
> org
> .apache
> .catalina
> .core
> .ApplicationFilterChain.servletService(ApplicationFilterChain.java:
> 427)
> at
> org
> .apache
> .catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:
> 315)
> at
> org
> .apache
> .catalina
> .core.StandardContextValve.invokeInternal(StandardContextValve.java:
> 287)
> at
> org
> .apache
> .catalina.core.StandardContextValve.invoke(StandardContextValve.java:
> 218)
> at
> org
> .apache
> .catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:648)
> at
> org
> .apache
> .catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:593)
> at com.sun.enterprise.web.WebPipeline.invoke(WebPipeline.java:94)
> at
> com
> .sun
> .enterprise
> .web
> .PESessionLockingStandardPipeline
> .invoke(PESessionLockingStandardPipeline.java:98)
> at
> org
> .apache
> .catalina.core.StandardHostValve.invoke(StandardHostValve.java:222)
> at
> org
> .apache
> .catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:648)
> at
> org
> .apache
> .catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:593)
> at
> org
> .apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:
> 587)
> at
> org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:1096)
> at
> org
> .apache
> .catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:
> 166)
> at
> org
> .apache
> .catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:648)
> at
> org
> .apache
> .catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:593)
> at
> org
> .apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:
> 587)
> at
> org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:1096)
> at
> org.apache.coyote.tomcat5.CoyoteAdapter.service(CoyoteAdapter.java:
> 288)
> at com.sun.enterprise.web.connector.grizzly.DefaultProcessorTask.invokeAdapter
> (DefaultProcessorTask.java:647)
> at com.sun.enterprise.web.connector.grizzly.DefaultProcessorTask.doProcess
> (DefaultProcessorTask.java:579)
> at com.sun.enterprise.web.connector.grizzly.DefaultProcessorTask.process
> (DefaultProcessorTask.java:831)
> at com.sun.enterprise.web.connector.grizzly.DefaultReadTask.executeProcessorTask
> (DefaultReadTask.java:341)
> at
> com
> .sun
> .enterprise
> .web.connector.grizzly.DefaultReadTask.doTask(DefaultReadTask.java:
> 263)
> at
> com
> .sun
> .enterprise
> .web.connector.grizzly.DefaultReadTask.doTask(DefaultReadTask.java:
> 214)
> at
> com.sun.enterprise.web.connector.grizzly.TaskBase.run(TaskBase.java:
> 265)
> at com.sun.enterprise.web.connector.grizzly.ssl.SSLWorkerThread.run
> (SSLWorkerThread.java:106)
> |#]
>
> [#|2009-10-08T16:39:59.526-0300|SEVERE|sun-appserver2.1|
> javax.enterprise.system.container.web|
> _ThreadID
> =19;_ThreadName=httpSSLWorkerThread-8080-0;_RequestID=52a5f523-
> f63f-4473-8f43-fa33a831d784;|StandardWrapperValve[Jersey Web
> Application]: PWC1406: Servlet.service() for servlet Jersey Web
> Application threw exception
> java.lang.NullPointerException
> at com.citespace.citespacerest.Test.getIt(Test.java:29)
> 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
> com
> .sun
> .jersey
> .server
> .impl.model.method.dispatch.AbstractResourceMethodDispatchProvider
> $
> TypeOutInvoker._dispatch(AbstractResourceMethodDispatchProvider.java:
> 156)
> at
> com
> .sun
> .jersey
> .server
> .impl
> .model
> .method
> .dispatch
> .ResourceJavaMethodDispatcher
> .dispatch(ResourceJavaMethodDispatcher.java:67)
> at
> com
> .sun
> .jersey
> .server.impl.uri.rules.HttpMethodRule.accept(HttpMethodRule.java:208)
> at
> com
> .sun
> .jersey
> .server
> .impl.uri.rules.ResourceClassRule.accept(ResourceClassRule.java:75)
> at
> com
> .sun
> .jersey
> .server
> .impl.uri.rules.RightHandPathRule.accept(RightHandPathRule.java:115)
> at
> com
> .sun
> .jersey
> .server
> .impl
> .uri
> .rules.RootResourceClassesRule.accept(RootResourceClassesRule.java:67)
> at
> com
> .sun
> .jersey
> .server
> .impl
> .application
> .WebApplicationImpl._handleRequest(WebApplicationImpl.java:746)
> at
> com
> .sun
> .jersey
> .server
> .impl
> .application
> .WebApplicationImpl.handleRequest(WebApplicationImpl.java:711)
> at
> com
> .sun
> .jersey
> .server
> .impl
> .application
> .WebApplicationImpl.handleRequest(WebApplicationImpl.java:702)
> at
> com
> .sun
> .jersey.spi.container.servlet.WebComponent.service(WebComponent.java:
> 340)
> at
> com
> .sun
> .jersey
> .spi
> .container.servlet.ServletContainer.service(ServletContainer.java:452)
> at
> com
> .sun
> .jersey
> .spi
> .container.servlet.ServletContainer.service(ServletContainer.java:633)
> at javax.servlet.http.HttpServlet.service(HttpServlet.java:847)
> at
> org
> .apache
> .catalina
> .core
> .ApplicationFilterChain.servletService(ApplicationFilterChain.java:
> 427)
> at
> org
> .apache
> .catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:
> 315)
> at
> org
> .apache
> .catalina
> .core.StandardContextValve.invokeInternal(StandardContextValve.java:
> 287)
> at
> org
> .apache
> .catalina.core.StandardContextValve.invoke(StandardContextValve.java:
> 218)
> at
> org
> .apache
> .catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:648)
> at
> org
> .apache
> .catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:593)
> at com.sun.enterprise.web.WebPipeline.invoke(WebPipeline.java:94)
> at
> com
> .sun
> .enterprise
> .web
> .PESessionLockingStandardPipeline
> .invoke(PESessionLockingStandardPipeline.java:98)
> at
> org
> .apache
> .catalina.core.StandardHostValve.invoke(StandardHostValve.java:222)
> at
> org
> .apache
> .catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:648)
> at
> org
> .apache
> .catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:593)
> at
> org
> .apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:
> 587)
> at
> org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:1096)
> at
> org
> .apache
> .catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:
> 166)
> at
> org
> .apache
> .catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:648)
> at
> org
> .apache
> .catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:593)
> at
> org
> .apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:
> 587)
> at
> org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:1096)
> at
> org.apache.coyote.tomcat5.CoyoteAdapter.service(CoyoteAdapter.java:
> 288)
> at com.sun.enterprise.web.connector.grizzly.DefaultProcessorTask.invokeAdapter
> (DefaultProcessorTask.java:647)
> at com.sun.enterprise.web.connector.grizzly.DefaultProcessorTask.doProcess
> (DefaultProcessorTask.java:579)
> at com.sun.enterprise.web.connector.grizzly.DefaultProcessorTask.process
> (DefaultProcessorTask.java:831)
> at com.sun.enterprise.web.connector.grizzly.DefaultReadTask.executeProcessorTask
> (DefaultReadTask.java:341)
> at
> com
> .sun
> .enterprise
> .web.connector.grizzly.DefaultReadTask.doTask(DefaultReadTask.java:
> 263)
> at
> com
> .sun
> .enterprise
> .web.connector.grizzly.DefaultReadTask.doTask(DefaultReadTask.java:
> 214)
> at
> com.sun.enterprise.web.connector.grizzly.TaskBase.run(TaskBase.java:
> 265)
> at com.sun.enterprise.web.connector.grizzly.ssl.SSLWorkerThread.run
> (SSLWorkerThread.java:106)
> |#]
>
>
>
> --
> Atenciosamente,
>
> Roan Brasil Monteiro
> http://roanbrasil.wordpress.com/