Java 使用Jersey 2.21的REST API请求中的可选参数

Java 使用Jersey 2.21的REST API请求中的可选参数,java,rest,jersey,jersey-2.0,Java,Rest,Jersey,Jersey 2.0,我正在玩Jersey 2.21,我想知道是否可能有一个“可选”参数,该参数可以出现在向服务器发出的请求中,也可以不出现 我想成功访问这两种方法: http://localhost:8080/my_domain/rest/api/myMethod/1 http://localhost:8080/my_domain/rest/api/myMethod 如您所见,我试图将integer(id)参数设置为可选参数 我已经声明了myMethod,如下所示: @GET @Path("myMethod/{i

我正在玩Jersey 2.21,我想知道是否可能有一个“可选”参数,该参数可以出现在向服务器发出的请求中,也可以不出现

我想成功访问这两种方法:

http://localhost:8080/my_domain/rest/api/myMethod/1
http://localhost:8080/my_domain/rest/api/myMethod
如您所见,我试图将integer(
id
)参数设置为可选参数

我已经声明了
myMethod
,如下所示:

@GET
@Path("myMethod/{id}")
@Produces(MediaType.APPLICATION_JSON + ";charset=UTF-8")
public String myMethod(@PathParam("id") Integer id, @Context HttpHeaders hh)
这项工作:

http://localhost:8080/my_domain/rest/api/myMethod/1
这也行得通:

http://localhost:8080/my_domain/rest/api/myMethod/
但是这不起作用,我不明白为什么。它抛出一个
404未找到
错误:

http://localhost:8080/my_domain/rest/api/myMethod

你能告诉我解决这个问题的正确方向吗?我不喜欢在我所有的REST方法调用中都强制使用斜杠,如果可能的话,我想禁止使用斜杠。

因此,在对中的一些答案进行了一些尝试之后,问题是使用这个

@Path("/myMethod{id: (/\\d+)?}") 
public Response get(@PathParam("id") int id) {}
使
/
位于捕获组中。因此,当Jersey试图解析
/1
时,它将得到一个异常并发送一个404。我们可以使用字符串,但它会变得丑陋,因为我们需要去掉前导的
/
,然后自己解析它

@Path("/myMethod{id: (/\\d+)?}") 
public Response get(@PathParam("id") String id) {
    id = id.replace("/", "");
    int parsed = Integer.parseInt(id);
}
我提出的另一个解决方案(用于OP的解决方案)是将
/
从数字中分离成两个不同的路径表达式,这样就不会在实际id中捕获前导的
/
,也不会在解析中失败

@Path("/method{noop: (/)?}{id: ((?<=/)\\d+)?}")
public Response get(@PathParam("id") int id) {}
这是测试的依赖项

<dependency>
    <groupId>org.glassfish.jersey.test-framework.providers</groupId>
    <artifactId>jersey-test-framework-provider-grizzly2</artifactId>
    <version>${jersey2.version}</version>
    <scope>test</scope>
</dependency>

org.glassfish.jersey.test-framework.providers
jersey-test-framework-provider-grizzly2
${jersey2.version}
测试
编辑 对于测试,最好使用装箱的
整数
而不是
int
作为方法参数。使用前者,您可以执行空检查,而不是接收原语的默认
0

有一种更简单的方法:

@GET
@Path("myMethod/{id}")
public String myMethod(@PathParam("id") Integer id) {
}

@GET
@Path("myMethod")
public String myMethod() {
  return myMethod(null);
}

不需要复杂的正则表达式。

@peeskillet请仔细阅读问题,因为这不是重复的。另一个问题是在请求的末尾使用斜杠,但在我的问题中,我要求去掉它。对不起。我认为你无法摆脱它。我已经探讨过这种可能性好几次了,但都找不到答案。也许有人知道。我只想提出两种方法。对我来说没什么意义两个人只有一种方法。一个方法用于集合,一个方法用于单个资源。实际上,它确实回答了您的问题,因为它使用正则表达式使斜杠成为可选的。你试过了吗?。我想我又跳得很快了。我试图解决的问题有点小different@peeskillet是的,我确实试过正则表达式,但没有运气,斜杠仍然是强制性的。对你有用吗?也许我做错了什么。我从来没有在真正的代码中使用过它(出于上述原因),但在回答问题时,我已经测试了很多次,它应该可以工作。您是否使用了类似于
myMethod{id:(/\\d+)}
?括号后面的
表示括号中包含的所有内容都是可选的。所以
/
后面跟数字是允许的,但不是必需的。这是一个很好的详细答案。非常感谢您的时间:)我现在面临一个与此解决方案和正则表达式相关的问题。。。当使用表单参数向
GET
中使用的相同路径发出
POST
请求时(两个不同的web服务,一个由
POST
请求触发,另一个由
GET
请求触发,但它们共享相同的路径:
/routes
),它抛出了一个
405方法,这是不允许的。在我的浏览器上调试时,我发现这个
405
响应带有参数
Allow:GET,OPTIONS
。你知道是什么导致了这种行为吗?如果我从
GET
中删除正则表达式,它将正确运行
POST
服务。您可能应该发布另一个问题,并提供完整的详细信息和简单的解决方案!
@GET
@Path("myMethod/{id}")
public String myMethod(@PathParam("id") Integer id) {
}

@GET
@Path("myMethod")
public String myMethod() {
  return myMethod(null);
}