我有一项服务,其中路径的最后一部分是可选的,用户可以同时输入/mypath/和/mypath/param1/。
我尝试使用正则表达式来过滤路径的最后一部分:
@Path("/mypath{param1: (/param1)?}")
我使用 RestEasy 作为我的 JAX-RS 提供程序,并且代码在 Tomcat 中按预期工作,但是当我在 JBoss 中部署它时,当我不提交可选部分时,我得到一个 405 返回代码。
我在这里做错了什么还是不可能以便携的方式完成这个?
问题是冒号前缺少空格:
@Path("/mypath{param1: (/param1)?}")
应该:
@Path("/mypath{param1 : (/param1)?}")
显然这是一个错误,因为规范使冒号周围的空格是可选的。我还发现我不是第一个被这个 bug 咬的。
就我而言,我不得不使用其他表达式:
@Path('/mypath/{param1 : (\\w+)?}')
否则你必须清理参数。
验证是否已经使用 /mypath 定义了接受不同方法的路径,这可能是您返回 405(不允许方法)的原因。另外,当您有可选参数时,我想最好将它们设为查询参数。
使用 Dropwizard 1.0 和 Java8,您可以使用 Optional
@Path("/news")
getLastNews(@QueryParam("topicId") String topicId, @QueryParam("limit") Optional<Integer> limit)
它将对两者都做出回应
/news?topicId=123213?limit=200
和
/news?topicId=123213