no injection source found error when using multiple @PathParams in Restful Resource using Jersey

16,294

The injection error you receive is caused by Number parameters. Since complex objects like Number are not supported in @PathParam implementation. You could easily fix this by the following code (also add the @GET)

@GET
@Path("loc/{userid}/{xloc}/{yloc}")
public String getNewitem(@PathParam("userid") String userId,
    @PathParam("xloc") int xLoc,
    @PathParam("yloc") int yLoc)
{
    String answer = "{\"itemid\":\"abcdefgh\"}";
    return answer;
}

There are many ways to work with complex objects in case you need more information than int can provide you. But then you must change the way to receive them since @PathParam is quite simple. For more details regarding complex usage, check Jackson to help you with object/json conversion. You probably will have something like this:

@POST
@Path("loc/{userid}")
public String createNewitem(@PathParam("userid") String userId, MyLocalization aLoc)
{
    String answer = "{\"itemid\":\"abcdefgh\"}";
    return answer;
}

The class MyLocalization is a pojo that you will create to be handled by jackson libs with following dependency:

  <dependency>
    <groupId>com.fasterxml.jackson.jaxrs</groupId>
    <artifactId>jackson-jaxrs-json-provider</artifactId>
    <version>2.2.3</version>
  </dependency>
Share:
16,294

Related videos on Youtube

vpitts
Author by

vpitts

Updated on June 04, 2022

Comments

  • vpitts
    vpitts almost 2 years

    I am working on a simple Restful web service using Rest / Jersey with Tomcat 7. Things are working just fine if all of my Paths include a single parameter. If I include one that uses more than one parameter, I encounter the "No injection source found" error when I try to hit any of the resource paths supported by my resource class - even those that were working before. If I comment out that particular piece of code, all of my other paths work as expected. But if I uncomment out that piece of code, I cannot use ANY of the my paths.

    Here is a snippet of my code:

    import javax.ws.rs.GET;
    import javax.ws.rs.Path;
    import javax.ws.rs.PathParam;
    import javax.ws.rs.Produces;
    import javax.ws.rs.core.MediaType;
    
    // get all the information about a specific item
    @GET
    @Path("/{id}")
    @Produces(MediaType.APPLICATION_JSON)
    public String getItem(@PathParam("id") String itemId)
    {
        String answer = "{";
        answer += "\"itemid\":\"" + itemId + "\",";
        answer += "\"type\":0,";
        answer += "\"sector\":322948,";
        answer += "\"created\":53249098220";
        answer += "}";
    
        return answer;
    }
    
    // if I comment out this method, all is fine; 
    // if I leave it in, error is thrown when I make any restful call
    // query to see if there is a new item for user
    @Path("/loc/{userid}/{xloc}/{yloc}")
    @Produces(MediaType.APPLICATION_JSON)
    public String getNewitem(@PathParam("userid") String userId,
        @PathParam("xloc") Number xLoc,
        @PathParam("yloc") Number yLoc)
    {
        String answer = "{\"itemid\":\"abcdefgh\"}";
        return answer;
    }
    

    Here is the error trace:

    javax.servlet.ServletException: Servlet.init() for servlet Jersey REST Service threw exception
        org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:501)
        org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:103)
        org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:950)
        org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:408)
        org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1070)
        org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:611)
        org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:314)
        java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
        java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
        org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
        java.lang.Thread.run(Unknown Source)
    root cause
    
    org.glassfish.jersey.server.model.ModelValidationException: Validation of the application resource model has failed during application initialization.
    
    [[FATAL] No injection source found for a parameter of type public java.lang.String com.drunkware.geobijous.resources.GBBijouResource.getNewBijou(java.lang.String,java.lang.Number,java.lang.Number) at index 1.; source='ResourceMethod{httpMethod=GET, consumedTypes=[], producedTypes=[application/json], suspended=false, suspendTimeout=0, suspendTimeoutUnit=MILLISECONDS, invocable=Invocable{handler=ClassBasedMethodHandler{handlerClass=class com.drunkware.geobijous.resources.GBBijouResource, handlerConstructors=[org.glassfish.jersey.server.model.HandlerConstructor@757bdd3c]}, definitionMethod=public java.lang.String com.drunkware.geobijous.resources.GBBijouResource.getNewBijou(java.lang.String,java.lang.Number,java.lang.Number), parameters=[Parameter [type=class java.lang.String, source=userid, defaultValue=null], Parameter [type=class java.lang.Number, source=latitude, defaultValue=null], Parameter [type=class java.lang.Number, source=longitude, defaultValue=null]], responseType=class java.lang.String}, nameBindings=[]}']
            org.glassfish.jersey.server.ApplicationHandler.initialize(ApplicationHandler.java:467)
            org.glassfish.jersey.server.ApplicationHandler.access$500(ApplicationHandler.java:163)
            org.glassfish.jersey.server.ApplicationHandler$3.run(ApplicationHandler.java:323)
            org.glassfish.jersey.internal.Errors$2.call(Errors.java:289)
            org.glassfish.jersey.internal.Errors$2.call(Errors.java:286)
            org.glassfish.jersey.internal.Errors.process(Errors.java:315)
            org.glassfish.jersey.internal.Errors.process(Errors.java:297)
            org.glassfish.jersey.internal.Errors.processWithException(Errors.java:286)
            org.glassfish.jersey.server.ApplicationHandler.<init>(ApplicationHandler.java:320)
            org.glassfish.jersey.server.ApplicationHandler.<init>(ApplicationHandler.java:285)
            org.glassfish.jersey.servlet.WebComponent.<init>(WebComponent.java:311)
            org.glassfish.jersey.servlet.ServletContainer.init(ServletContainer.java:170)
            org.glassfish.jersey.servlet.ServletContainer.init(ServletContainer.java:358)
            javax.servlet.GenericServlet.init(GenericServlet.java:158)
            org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:501)
            org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:103)
            org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:950)
            org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:408)
            org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1070)
            org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:611)
            org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:314)
            java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
            java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
            org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
            java.lang.Thread.run(Unknown Source)
    

    Any suggestions to get around this problem? I am using jersey 2.12. Is this a known bug?