簡體   English   中英

使用Jersey在Restful Resource中使用多個@PathParams時沒有發現注入源錯誤

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

我正在使用Rest / Jersey和Tomcat 7進行一個簡單的Restful Web服務。如果我的所有Path都包含一個參數,那么工作正常。 如果我包含一個使用多個參數的參數,當我嘗試點擊我的資源類支持的任何資源路徑時,我會遇到“找不到注入源”錯誤 - 即使是之前正在工作的那些資源路徑。 如果我注釋掉那段特定代碼,那么我的所有其他路徑都會按預期工作。 但如果我取消注釋掉那段代碼,我就無法使用任何一條路徑。

這是我的代碼片段:

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;
}

這是錯誤跟蹤:

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)

有什么建議可以解決這個問題嗎? 我正在使用球衣2.12。 這是一個已知的錯誤?

您收到的注入錯誤是由Number參數引起的。 由於@PathParam實現不支持像Number這樣的復雜對象。 您可以通過以下代碼輕松解決此問題(同時添加@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;
}

如果您需要比int可以提供的更多信息,有許多方法可以處理復雜對象。 但是你必須改變接收它們的方式,因為@PathParam非常簡單。 有關復雜用法的更多詳細信息,請檢查Jackson以幫助您進行對象/ json轉換。 你可能會有這樣的事情:

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

MyLocalization類是一個pojo,你將創建由jackson libs處理,具有以下依賴關系

  <dependency>
    <groupId>com.fasterxml.jackson.jaxrs</groupId>
    <artifactId>jackson-jaxrs-json-provider</artifactId>
    <version>2.2.3</version>
  </dependency>

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM