Resteasy可以查看JAX-RS方法的参数类型吗?

时间:2016-09-22 09:26:22

标签: java web-services jax-rs resteasy

我们在我们的JAX-RS网络服务中使用Resteasy 3.0.9,最近切换到3.0.19,我们开始看到很多RESTEASY002142: Multiple resource methods match request警告。

例如,我们有类似的方法:

@Path("/{id}") 
public String getSome(UUID id)

@Path("/{id}") 
public String getSome(int id)

我不确定它在3.0.9中是如何工作的,可能,我们非常幸运,因为Resteasy似乎从所有候选人中选择了第一种方法(以及3.0.19种候选方法)。

一种解决方案是明确指定正则表达式:@Path("/{id : [0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}}")

但有没有办法以某种方式告诉Resteasy查看方法参数并自动构建适当的正则表达式?

1 个答案:

答案 0 :(得分:3)

据我所知,RESTEasy在匹配请求时不会考虑方法参数类型。根据{{​​3}}(RESTEasy实现的),这就是请求匹配过程的工作方式:

  

通过比较规范化的请求,将请求与相应的资源方法或子资源方法匹配   请求URI,任何请求实体的媒体类型和请求的响应   实体格式到资源类及其方法的元数据注释。如果没有匹配的资源   可以找到方法或子资源方法,然后返回适当的错误响应。 [...]

JAX-RS实现必须将请求的URI与JSR-339注释值匹配。在@Path注释值中,您可以定义变量,用大括号({})表示。

作为请求匹配的一部分,如果未指定正则表达式,则JAX-RS实现将使用指定的正则表达式([ˆ/]+?)替换每个URI模板变量。

要解决您在问题中提到的情况,您应该指定一个正则表达式来匹配一种资源方法上的UUID:

@Path("{id : [0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}}")

您还可以考虑使用正则表达式来匹配其他资源方法上的整数:

@Path("{id : \\d+}")