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

Jersey 2.x特定URL的Servlet映射失效问题求助

Jersey 2.x 特定URL映射返回404的问题排查

问题描述

使用Jersey 2.x创建名为myapp的Servlet,web.xml配置如下:

<servlet>
    <servlet-name>myapp</servlet-name>
    <servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>
    <init-param>
        <param-name>jersey.config.server.provider.packages</param-name>
        <param-value>
            com.private.myapp.resource
        </param-value>      
    </init-param>
    <load-on-startup>1</load-on-startup>
</servlet>

对应的Servlet映射配置:

<servlet-mapping>
    <servlet-name>myapp</servlet-name>
    <url-pattern>/instance/create</url-pattern>
    <url-pattern>/instance/list</url-pattern>
</servlet-mapping>

请求$SERVER_ROOT/instance/create或$SERVER_ROOT/instance/list时返回404错误;但将Servlet映射改为/*后,请求上述URL可正常响应。

原因分析

核心问题是Jersey的路径匹配逻辑与Servlet映射的交互方式:

  • 当使用具体URL路径(如/instance/create)映射Servlet时,Jersey会将该完整路径视为自身的"应用根路径"。此时如果资源类的@Path注解是@Path("/instance/create")或@Path("/instance"),Jersey会在/instance/create这个根路径下去查找匹配的资源,自然无法找到,返回404。
  • 当使用/*映射时,Jersey将$SERVER_ROOT作为应用根路径,请求路径中的/instance/create会完整传递给Jersey的资源匹配机制,因此能正确匹配到对应的资源类。

解决方法

方法1:添加Jersey根路径参数(推荐)

在Servlet初始化参数中指定jersey.config.servlet.filter.path,同时调整映射路径为前缀形式,让Jersey正确识别资源路径:

<servlet>
    <servlet-name>myapp</servlet-name>
    <servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>
    <init-param>
        <param-name>jersey.config.server.provider.packages</param-name>
        <param-value>com.private.myapp.resource</param-value>      
    </init-param>
    <!-- 指定Jersey的根路径为"/",确保路径匹配逻辑正确 -->
    <init-param>
        <param-name>jersey.config.servlet.filter.path</param-name>
        <param-value>/</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
    <servlet-name>myapp</servlet-name>
    <url-pattern>/instance/*</url-pattern>
</servlet-mapping>

此配置下,所有/instance/开头的请求都会被交给Jersey,Jersey会用/instance/之后的部分匹配资源类的@Path注解。

方法2:调整资源类的@Path注解

如果坚持使用具体路径映射,需要让资源类的@Path与Servlet映射路径匹配,例如:

@Path("")
public class InstanceResource {
    @POST
    public Response createInstance() {
        // 业务逻辑处理
    }
}

这种方式灵活性极低,仅适用于单一路径场景,不推荐。


内容的提问来源于stack exchange,提问作者KBV

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 11:31:03