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
相关产品推荐
相关产品推荐

