JAX-RS @PathParam:如何传递任何内容,包括"?"

时间:2016-12-16 01:44:10

标签: java rest jersey jax-rs

我有@PathParam的以下JAX-RS方法。

@GET
@Produces(MediaType.APPLICATION_XML)
@Path("collect/{orderItemID}")
public Response collect(@PathParam("orderItemID") String orderItemID) {
    System.out.println("Order Item ID: " + orderItemID);
    ....
}

我希望该方法接受传递给它的任何内容。但是,当我传递以下字符串时,容器WebLogic返回HTTP 404 Not Found。问题出在?在字符串的开头。如果我删除?,它将被接受,System.out.println()方法将打印出该值。

?ProductCode=yyy&EntityNo=1234&Name=what&FileReference=xxx

接下来,我将@Path更改为以下值:

@Path("collect/{orderItemID : (.+)?}")

这次,当我用?传递上面的字符串时,没有找到HTTP 404 Not Found。但是,在方法内部,System.out.println()现在打印orderItemID的空值。

如何指定@Path以便该方法可以接受任何

1 个答案:

答案 0 :(得分:1)

您在网址中尝试使用的内容

?ProductCode=yyy&EntityNo=1234&Name=what&FileReference=xxx

称为query string。这不是您尝试作为单个路径参数的东西。当Jersey检索到URL时,它将解析URL并提取查询字符串。它知道它是一个查询字符串,因为?

一旦有了查询字符串,它就会解析它,拆分=&,并以多种不同的方式使密钥值对可用。将它们放入资源方法的一种方法就是使用@QueryParam。使用此注释,您可以使用该键,该键的将传递给方法

public Response collect(@QueryParam("ProductCode") String productCode,
                        @QueryParam("EntityNo") String entityNo,
                        @QueryParam("Name") String name,
                        @QueryParam("FileReference") String fileRef) {}

如果您的目标是实际能够传递任何,那么问题实际上是关于传递?(这不是对查询字符串的引用),当您需要时要做的就像是

@Path("{anything: .*}")

然后在客户端,您需要URL encode ?