users@jersey.java.net

[Jersey] Jersey error PerRequestTypeInjectableProvider

From: Denis Murzin <denis-murzin_at_mail.ru>
Date: Wed, 15 Jun 2011 15:11:50 +0400

Good day.

There is a class
@ Provider
public class OAuth {

    private String name;

    public OAuth () {
    }

    public String getName () {
        return name;
    }

    public void setName (String name) {
        </span>this.name = name;
    }
}

Created for this class provider
@ Provider
public class MyPerReqProvider extends PerRequestTypeInjectableProvider <Context, OAuth> {

    public MyPerReqProvider () {
        super (OAuth.class);
   }

    @ Override
    public Injectable <OAuth> getInjectable (ComponentContext componentContext, Context context) {
        return new Injectable <OAuth> () {
            @ Override
            public OAuth getValue () {
                return new OAuth ();
            }
        };
    }
}

I declare the filter

@ Context OAuth auth;
    public RequestFilter () {
    }
    @ Override
    public ContainerRequest filter (ContainerRequest request) {
         auth.setName ("admin");
    }


and then in the method call
@ Context OAuth auth;

@ Path ("/ xml")
@ POST
@ Produces (MediaType.APPLICATION_XML)
public XmlResponse getMessageXML (@ Context HttpServletRequest request) {
      System.out.println (auth.getName ());
}

and upon request receive an error
15.06.2011 14:22:51 com.sun.jersey.spi.inject.Errors processErrorMessages
SEVERE: The following errors and warnings have been detected with resource and / or provider classes:
  SEVERE: Missing dependency for field: ru.mw.http.OAuth ru.mw.http.RequestFilter.auth

here's another
javax.servlet.ServletException: Servlet.init () for servlet Jersey Web Application threw exception
org.apache.catalina.valves.ErrorReportValve.invoke (ErrorReportValve.java: 108)
org.apache.catalina.valves.AccessLogValve.invoke (AccessLogValve.java: 556)
org.apache.catalina.connector.CoyoteAdapter.service (CoyoteAdapter.java: 401)
org.apache.coyote.http11.Http11AprProcessor.process (Http11AprProcessor.java: 281)
org.apache.coyote.http11.Http11AprProtocol $ Http11ConnectionHandler.process (Http11AprProtocol.java: 579)
org.apache.tomcat.util.net.AprEndpoint $ SocketProcessor.run (AprEndpoint.java: 1568)
java.util.concurrent.ThreadPoolExecutor $ Worker.runTask (ThreadPoolExecutor.java: 886)
java.util.concurrent.ThreadPoolExecutor $ Worker.run (ThreadPoolExecutor.java: 908)
java.lang.Thread.run (Thread.java: 662)

root cause

com.sun.jersey.spi.inject.Errors $ ErrorMessagesException
com.sun.jersey.spi.inject.Errors.processErrorMessages (Errors.java: 170)
com.sun.jersey.spi.inject.Errors.postProcess (Errors.java: 136)
com.sun.jersey.spi.inject.Errors.processWithErrors (Errors.java: 199)
com.sun.jersey.server.impl.application.WebApplicationImpl.initiate (WebApplicationImpl.java: 769)
com.sun.jersey.server.impl.application.WebApplicationImpl.initiate (WebApplicationImpl.java: 764)
com.sun.jersey.spi.container.servlet.ServletContainer.initiate (ServletContainer.java: 488)
com.sun.jersey.spi.container.servlet.ServletContainer $ InternalWebComponent.initiate (ServletContainer.java: 318)
com.sun.jersey.spi.container.servlet.WebComponent.load (WebComponent.java: 609)
com.sun.jersey.spi.container.servlet.WebComponent.init (WebComponent.java: 210)
com.sun.jersey.spi.container.servlet.ServletContainer.init (ServletContainer.java: 373)
com.sun.jersey.spi.container.servlet.ServletContainer.init (ServletContainer.java: 556)
javax.servlet.GenericServlet.init (GenericServlet.java: 151)
org.apache.catalina.valves.ErrorReportValve.invoke (ErrorReportValve.java: 108)
org.apache.catalina.valves.AccessLogValve.invoke (AccessLogValve.java: 556)
org.apache.catalina.connector.CoyoteAdapter.service (CoyoteAdapter.java: 401)
org.apache.coyote.http11.Http11AprProcessor.process (Http11AprProcessor.java: 281)
org.apache.coyote.http11.Http11AprProtocol $ Http11ConnectionHandler.process (Http11AprProtocol.java: 579)
org.apache.tomcat.util.net.AprEndpoint $ SocketProcessor.run (AprEndpoint.java: 1568)
java.util.concurrent.ThreadPoolExecutor $ Worker.runTask (ThreadPoolExecutor.java: 886)
java.util.concurrent.ThreadPoolExecutor $ Worker.run (ThreadPoolExecutor.java: 908)
java.lang.Thread.run (Thread.java: 662)


If, instead of using PerRequestTypeInjectableProvider  SingletonTypeInjectableProvider  then all is well, please answer what I am doing wrong

All classes define both
public class initApp extends Application {

    private Set <Object> singletons = new HashSet <Object> ();
    private Set <Class <?>> classes = new HashSet <Class <?>>();

    public initApp () {
        classes.add (MyPerReqProvider.class);
        classes.add (receiver.class);
        classes.add (NotFoundExceptionMapper.class);
    }

    @ Override
    public Set <Class <?>> getClasses () {
        return classes;
    }

    @ Override
    public Set <Object> getSingletons () {
        return singletons;
    }


Thanks in advance.