我们在我们的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查看方法参数并自动构建适当的正则表达式?
答案 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+}")