gpt4 book ai didi

java - 使用 Jersey 在 Restful Resource 中使用多个 @PathParams 时未发现注入(inject)源错误

转载 作者:塔克拉玛干 更新时间:2023-11-01 22:45:35 26 4
gpt4 key购买 nike

我正在使用 Rest/Jersey 和 Tomcat 7 开发一个简单的 Restful Web 服务。如果我的所有路径都包含一个参数,一切都很好。如果我包含一个使用多个参数的参数,当我尝试访问我的资源类支持的任何资源路径时,我会遇到“未找到注入(inject)源”错误——即使是那些之前工作的资源路径。如果我注释掉那段特定的代码,我的所有其他路径都会按预期工作。但是,如果我取消注释那段代码,我将无法使用我的任何路径。

这是我的代码片段:

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)

有什么解决这个问题的建议吗?我正在使用 Jersey 2.12。这是已知错误吗?

最佳答案

您收到的注入(inject)错误是由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,您将创建它以由具有以下 dependency 的 jackson 库处理。 :

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

关于java - 使用 Jersey 在 Restful Resource 中使用多个 @PathParams 时未发现注入(inject)源错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25736819/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com