Jersey从1.19升级至2.29后JAX-RS资源末尾斜杠变为必填的问题求助
Jersey从1.19升级至2.29后JAX-RS资源末尾斜杠变为必填的问题求助
兄弟,我之前升级Jersey的时候也踩过这个一模一样的坑!太懂你那种测试突然爆405的懵圈感了😂
这个问题其实是Jersey 2.x默认改变了路由匹配的行为——Jersey 1.x会自动忽略资源路径末尾的斜杠,而2.x开始默认采用严格匹配策略,导致带@Path("/")的方法只能匹配带末尾斜杠的请求(比如/api/bookings/),不带斜杠的请求就触发405了。
给你两种可行的解决办法,按需选择:
1. 全局开启末尾斜杠可选(推荐)
Jersey 2.16及以上版本提供了一个官方的SlashesAreOptionalFeature,注册它之后就能全局恢复1.x那种宽松的匹配逻辑,所有资源的末尾斜杠都会变成可选。
如果你用Java代码配置ResourceConfig:
public class MyJerseyApp extends ResourceConfig { public MyJerseyApp() { // 注册这个Feature,开启末尾斜杠可选 register(org.glassfish.jersey.server.SlashesAreOptionalFeature.class); // 注册你的资源类 register(BookingResources.class); // 其他业务相关配置... } }
如果你用web.xml配置:
在Jersey的servlet配置里添加初始化参数,注册这个Feature:
<servlet> <servlet-name>Jersey Servlet</servlet-name> <servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class> <init-param> <param-name>jersey.config.server.provider.classnames</param-name> <param-value>org.glassfish.jersey.server.SlashesAreOptionalFeature</param-value> </init-param> <!-- 其他初始化参数 --> </servlet>
2. 单个方法配置双路径(局部生效)
如果你不想全局修改,只想让某个特定方法支持带/不带斜杠的请求,可以给@Path传一个数组,同时定义带斜杠和不带斜杠的路径:
@POST @Path({"/", ""}) // 同时匹配带斜杠和空路径的请求 public Response createNewBooking(/* 方法参数 */) { // 你的业务逻辑实现 }
这样不管请求是/api/bookings还是/api/bookings/,都能命中这个方法。
最后补充一句:这个行为变化是Jersey团队为了更贴合JAX-RS 2.0规范的模糊点做的调整,虽然一开始有点坑,但用上面的方法就能轻松改回你习惯的旧逻辑啦!
内容来源于stack exchange
相关产品推荐
相关产品推荐

