Java 在方法中同时读取路径参数和json正文请求

Java 在方法中同时读取路径参数和json正文请求,java,json,web-services,jersey,Java,Json,Web Services,Jersey,当我的方法看起来像这样时,我得到了以下错误 @POST @Path("/share") @Produces(MediaType.APPLICATION_JSON) @Consumes(MediaType.APPLICATION_JSON) public Response shareit(@PathParam("USERID") String userID,Map<String,String[]> paramValue){ ..... ..... }

当我的方法看起来像这样时,我得到了以下错误

@POST
    @Path("/share")
    @Produces(MediaType.APPLICATION_JSON)
    @Consumes(MediaType.APPLICATION_JSON)
    public Response shareit(@PathParam("USERID") String userID,Map<String,String[]> paramValue){

.....
.....

}
@POST
@路径(“/共享”)
@产生(MediaType.APPLICATION_JSON)
@使用(MediaType.APPLICATION_JSON)
公共响应shareit(@PathParam(“USERID”)字符串USERID,映射参数值){
.....
.....
}
如果我从参数@PathParam(“USERID”)字符串USERID或Map paramValue中删除其中一个参数,则效果很好。我不能同时读取路径参数和json正文请求吗

错误:

Dec 01, 2013 11:30:20 PM org.apache.catalina.core.StandardContext loadOnStartup
SEVERE: Servlet /CloudServices threw load() exception
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 javax.ws.rs.core.Response com.app.cloud.share.Share.shareit(java.lang.String,java.util.Map) at index 0.; source='ResourceMethod{httpMethod=POST, consumedTypes=[application/json], producedTypes=[application/json], suspended=false, suspendTimeout=0, suspendTimeoutUnit=MILLISECONDS, invocable=Invocable{handler=ClassBasedMethodHandler{handlerClass=class com.rjil.cloud.share.Share, handlerConstructors=[org.glassfish.jersey.server.model.HandlerConstructor@54fe88f3]}, handlingMethod=public javax.ws.rs.core.Response com.rjil.cloud.share.Share.shareit(java.lang.String,java.util.Map), parameters=[Parameter [type=class java.lang.String, source=USERID, defaultValue=null], Parameter [type=interface java.util.Map, source=null, defaultValue=null]], responseType=class javax.ws.rs.core.Response}, nameBindings=[]}']
    at org.glassfish.jersey.server.ApplicationHandler.initialize(ApplicationHandler.java:427)
    at org.glassfish.jersey.server.ApplicationHandler.access$500(ApplicationHandler.java:162)
    at org.glassfish.jersey.server.ApplicationHandler$3.run(ApplicationHandler.java:287)
    at org.glassfish.jersey.internal.Errors$2.call(Errors.java:289)
    at org.glassfish.jersey.internal.Errors$2.call(Errors.java:286)
    at org.glassfish.jersey.internal.Errors.process(Errors.java:315)
    at org.glassfish.jersey.internal.Errors.process(Errors.java:297)
    at org.glassfish.jersey.internal.Errors.processWithException(Errors.java:286)
    at org.glassfish.jersey.server.ApplicationHandler.<init>(ApplicationHandler.java:284)
    at org.glassfish.jersey.servlet.WebComponent.<init>(WebComponent.java:302)
    at org.glassfish.jersey.servlet.ServletContainer.init(ServletContainer.java:167)
    at org.glassfish.jersey.servlet.ServletContainer.init(ServletContainer.java:349)
    at javax.servlet.GenericServlet.init(GenericServlet.java:160)
    at org.apache.catalina.core.StandardWrapper.initServlet(StandardWrapper.java:1280)
    at org.apache.catalina.core.StandardWrapper.loadServlet(StandardWrapper.java:1193)
    at org.apache.catalina.core.StandardWrapper.load(StandardWrapper.java:1088)
    at org.apache.catalina.core.StandardContext.loadOnStartup(StandardContext.java:5176)
    at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5460)
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
    at org.apache.catalina.core.StandardContext.reload(StandardContext.java:3954)
    at org.apache.catalina.loader.WebappLoader.backgroundProcess(WebappLoader.java:426)
    at org.apache.catalina.core.ContainerBase.backgroundProcess(ContainerBase.java:1345)
    at org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.processChildren(ContainerBase.java:1530)
    at org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.processChildren(ContainerBase.java:1540)
    at org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.processChildren(ContainerBase.java:1540)
    at org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.run(ContainerBase.java:1519)
    at java.lang.Thread.run(Thread.java:744)
2013年12月1日晚上11:30:20 org.apache.catalina.core.StandardContext loadOnStartup
严重:Servlet/CloudServices引发load()异常
org.glassfish.jersey.server.model.ModelValidationException:应用程序资源模型的验证在应用程序初始化期间失败。
[[FATAL]在索引0处找不到public javax.ws.rs.core.Response com.app.cloud.share.share.shareit(java.lang.String,java.util.Map)类型参数的注入源;source='ResourceMethod{httpMethod=POST,consumedTypes=[application/json],producedTypes=[application/json],suspended=false,suspendTimeout=0,suspendTimeoutUnit=毫秒,invocable=invocable{handler=ClassBasedMethodHandler{handlerClass=class com.rjil.cloud.share.share,handlerConstructors=[org.glassfish.jersey.server.model。HandlerConstructor@54fe88f3]},handlingMethod=public javax.ws.rs.core.Response com.rjil.cloud.share.share.shareit(java.lang.String,java.util.Map),参数=[参数[type=class java.lang.String,source=USERID,defaultValue=null],参数[type=interface java.util.Map,source=null,defaultValue=null]],responseType=class javax.ws.rs.core.Response},nameBindings=[]}]
位于org.glassfish.jersey.server.ApplicationHandler.initialize(ApplicationHandler.java:427)
位于org.glassfish.jersey.server.ApplicationHandler.access$500(ApplicationHandler.java:162)
位于org.glassfish.jersey.server.ApplicationHandler$3.run(ApplicationHandler.java:287)
位于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.(ApplicationHandler.java:284)
位于org.glassfish.jersey.servlet.WebComponent(WebComponent.java:302)
位于org.glassfish.jersey.servlet.ServletContainer.init(ServletContainer.java:167)
位于org.glassfish.jersey.servlet.ServletContainer.init(ServletContainer.java:349)
位于javax.servlet.GenericServlet.init(GenericServlet.java:160)
位于org.apache.catalina.core.StandardWrapper.initServlet(StandardWrapper.java:1280)
位于org.apache.catalina.core.StandardWrapper.loadServlet(StandardWrapper.java:1193)
位于org.apache.catalina.core.StandardWrapper.load(StandardWrapper.java:1088)
位于org.apache.catalina.core.StandardContext.loadOnStartup(StandardContext.java:5176)
位于org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5460)
位于org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
位于org.apache.catalina.core.StandardContext.reload(StandardContext.java:3954)
位于org.apache.catalina.loader.WebappLoader.backgroundProcess(WebappLoader.java:426)
位于org.apache.catalina.core.ContainerBase.backgroundProcess(ContainerBase.java:1345)
位于org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.processChildren(ContainerBase.java:1530)
位于org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.processChildren(ContainerBase.java:1540)
位于org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.processChildren(ContainerBase.java:1540)
位于org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.run(ContainerBase.java:1519)
运行(Thread.java:744)

问题似乎与API方法的“返回类型”有关,您已将其定义为
响应
,请参阅错误消息:

找不到类型为public javax.ws.rs.core.Response的参数的注入源


您应该指定自己的“Response”类型(应该返回一个JSON对象)。要定义“request”和“Response”类型,可以使用JAXB(),它基本上允许您指定一个对象,该对象定义要交换(接收和发送)的消息的“格式”通过API方法。这非常好,因为它允许您自动处理JSON(还有XML)和其他MIME表示。

似乎您没有在任何
@Path
注释中定义
{USERID}
占位符(它不在您的资源方法中,我猜它也不在资源类的
@Path
注释中)。您需要将
@PathParam(“USERID”)
@Path
中的模板相匹配,通常:

@Path("/share/{USERID}")

我认为您弄错了。您截断了上面的错误消息。完整的错误消息(为了可读性,省略了包名)是“找不到public Response Share.shareit(字符串,映射)类型的参数的注入源”。它抱怨的是整个方法签名,而不仅仅是返回类型。我经常返回响应对象,只要使用Response.entity()将JSON对象放在响应中就可以了。