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

Java Resteasy可以查看JAX-RS方法的参数类型吗?,java,web-services,jax-rs,resteasy,Java,Web Services,Jax Rs,Resteasy,我们在JAX-RS Web服务中使用Resteasy 3.0.9,最近切换到3.0.19,在那里我们开始看到很多RESTEASY002142:多个资源方法匹配请求警告 例如,我们有如下方法: @Path("/{id}") public String getSome(UUID id) @Path("/{id}") public String getSome(int id) 我不确定它在3.0.9中是如何工作的,也许,我们只是非常幸运,因为Resteasy似乎从所有候选方法中选择了第一种方法

我们在JAX-RS Web服务中使用Resteasy 3.0.9,最近切换到3.0.19,在那里我们开始看到很多RESTEASY002142:多个资源方法匹配请求警告

例如,我们有如下方法:

@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}


但是有没有一种方法可以让REST轻松地查看方法参数并自动构造适当的正则表达式呢

据我所知,RESTEasy在匹配请求时不会考虑方法参数类型。根据RESTEasy的实现,请求匹配过程是这样工作的:

通过比较标准化方法,将请求与相应的资源方法或子资源方法相匹配 请求URI、任何请求实体的媒体类型以及请求的响应 资源类及其方法上元数据注释的实体格式。如果没有匹配的资源 方法或子资源方法,然后返回相应的错误响应。[……]

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

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

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

@路径{id:[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}

,您也可以考虑正则表达式来匹配其他资源方法的整数:

@路径{id:\\d+}
谢谢你的回答,但是,这并不能完全回答这个问题。JAX-RS2.0规范并不禁止实现在请求匹配的第2步中查看参数类型:对于C中的每个类Z,为每个子资源方法和定位器向E添加正则表达式,如下所示:i。对于每个子资源方法D,添加RTD,其中TD是子资源方法的URI路径模板。Resteasy已经将像/things/{id}这样的模板转换为正则表达式。因此,基于类型的正则表达式是有可能的。因此,根据JAX-RS2.0规范,至少部分不应该是正确的。如果我错了,请告诉我规范禁止的确切位置。@JAX-RS 2.0规范规定,实现不需要使用规范中所述的算法,但必须产生与规范中所述算法产生的结果相同的结果。JAX-RS 2.0规范并不禁止实现查看方法类型参数,据我所知,RESTEasy没有这样做。@关于匹配请求时的正则表达式,请参阅第3.7.3节将URI模板转换为JAX-RS 2.0规范的正则表达式。对于这种情况,步骤3是最相关的:用包含指定正则表达式或[ˆ/]+的捕获组替换每个URI模板变量?如果未指定正则表达式。因此,对于模板变量,JAX-RS实现将使用您的正则表达式或默认表达式。接受答案。