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

Can Resteasy look into parameter's type for JAX-RS methods?

我们为我们的 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 似乎是 select 所有候选方法中的第一个方法(以及 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(RESTEasy 实现),请求匹配过程是这样工作的:

A request is matched to the corresponding resource method or sub-resource method by comparing the normalized request URI, the media type of any request entity, and the requested response entity format to the metadata annotations on the resource classes and their methods. If no matching resource method or sub-resource method can be found then an appropriate error response is returned. [...]

JAX-RS 实现必须将请求的 URI 与 @Path annotation values. In the @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+}")