如何配置@Path("")和@Path("/")使JAX-RS资源方法匹配对应路径?
解决JAX-RS路径区分尾部斜杠的问题
这个问题其实是JAX-RS默认的尾部斜杠处理逻辑导致的——它会自动把路径末尾的斜杠视为可选的,所以@Path("/")和@Path("")会被当成等价的路径,自然所有请求都跑到withRoot方法里了。下面给你两种靠谱的解决办法:
方法一:开启严格的尾部斜杠匹配(推荐)
大多数主流的JAX-RS实现(比如Jersey、RESTEasy)都支持关闭这种“自动等价”的逻辑,开启严格匹配模式,这样就能精准区分带/和不带/的路径了。
针对Jersey的配置
在你的应用配置类里添加一行配置即可:
@ApplicationPath("/api") public class MyAppConfig extends ResourceConfig { public MyAppConfig() { // 扫描你的资源类所在包 packages("com.your.package"); // 开启严格的尾部斜杠处理 property(ServerProperties.TRAILING_SLASH_HANDLING, TrailingSlashHandling.STRICT); } }
配置完成后,@Path("/")就只会匹配.../path/这种带尾部斜杠的请求,@Path("")则专门处理.../path不带斜杠的情况。
针对RESTEasy的配置
RESTEasy的配置逻辑类似,你可以在应用类里设置对应的属性:
public class MyApp extends Application { @Override public Map<String, Object> getProperties() { Map<String, Object> props = new HashMap<>(); // 开启严格模式 props.put("resteasy.trailing.slash.handling", "STRICT"); return props; } }
方法二:用正则表达式精确约束路径
如果不想修改全局配置,也可以通过路径的正则表达式来精准匹配:
@GET // 匹配带尾部斜杠的路径 @Path("/") public void withRoot() { int x = 0; } @GET // 精确匹配空路径(不带尾部斜杠) @Path("{:empty}") public void withoutRoot() { int x = 0; }
不过这种方式的兼容性可能稍差,不同JAX-RS实现对正则的解析细节可能有差异,所以还是更推荐第一种全局配置的方法。
另外要注意:如果你的资源类本身带有@Path注解(比如@Path("path")),上面的方法依然完全适用——方法级的@Path是相对于类级路径的,所以类上的@Path("path")加上方法的@Path("/")就对应.../path/,@Path("")对应.../path。
内容的提问来源于stack exchange,提问作者emeraldhieu
相关产品推荐
相关产品推荐

