You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.07 08:44:28