我们使用 Resteasy 3.0.9 作为 JAX-RS Web 服务,最近切换到 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 查看方法参数并自动构建适当的正则表达式?
据我所知,RESTEasy在匹配请求时不会考虑方法参数类型。根据JSR-339 https://jcp.org/en/jsr/detail?id=339(RESTEasy 实现),这就是请求匹配过程的工作原理:
通过比较规范化的方法,将请求匹配到相应的资源方法或子资源方法
请求 URI、任何请求实体的媒体类型以及请求的响应
资源类及其方法的元数据注释的实体格式。如果没有匹配的资源
方法或子资源方法可以找到,然后返回适当的错误响应。 [...]
JAX-RS 实现必须将请求的 URI 与@Path http://docs.oracle.com/javaee/7/api/javax/ws/rs/Path.html注释值。在里面@Path http://docs.oracle.com/javaee/7/api/javax/ws/rs/Path.html注释值您可以定义变量,用大括号表示({
and }
).
作为请求匹配的一部分,JAX-RS 实现将用以下内容替换每个 URI 模板变量:指定正则表达式 or ([ˆ/]+?)
如果没有指定正则表达式。
为了解决您在问题中提到的情况,您应该指定一个正则表达式来匹配一种资源方法上的 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+}")
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)