从Jersey 1.19+Spring 5迁移至Jersey 2.25+Spring 5遇404问题求助
针对你遇到的迁移后控制台无报错但访问返回404的问题,结合Jersey 1.x到2.x的核心变更,给你整理了几个最可能的原因和排查步骤:
1. 核心Servlet类配置错误
Jersey 2.x彻底更换了Servlet容器的类路径,旧版本的com.sun.jersey.spi.container.servlet.ServletContainer已经被替换为org.glassfish.jersey.servlet.ServletContainer。你得检查web.xml里的<servlet-class>配置,如果还是沿用旧类名,请求根本不会被Jersey 2.x处理,直接返回404。
示例正确配置:
<servlet> <servlet-name>Jersey Servlet</servlet-name> <servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class> <!-- 其他初始化参数 --> </servlet>
2. 包扫描参数键名变更
Jersey 2.x修改了包扫描的初始化参数键,旧版本的com.sun.jersey.config.property.packages要换成jersey.config.server.provider.packages。如果你的web.xml里还是用旧的参数名,Jersey无法扫描到你的资源类,自然没有可匹配的接口。
示例正确配置:
<init-param> <param-name>jersey.config.server.provider.packages</param-name> <param-value>com.yourpackage.resources</param-value> </init-param>
3. Spring集成配置不兼容
jersey-spring3和旧的jersey-spring在Spring集成逻辑上有很大差异:
- 要确保Spring上下文正确加载Jersey的
ResourceConfig子类,或者通过javax.ws.rs.Application实现类来注册资源; - 别再用旧的Spring相关初始化参数,比如
com.sun.jersey.api.json.POJOMappingFeature这类旧参数,Jersey 2.x已经改用新的JSON配置方式; - 检查是否存在Spring bean和Jersey资源的初始化顺序问题,有些情况下Spring上下文加载完成但Jersey资源未被正确注册。
4. 上下文映射与路径匹配问题
检查web.xml中的<url-pattern>配置,确保请求路径能被Jersey Servlet拦截。比如如果你的应用上下文是/myapp,而Jersey的url-pattern是/api/*,那你得访问/myapp/api/xxx才能触发Jersey处理,直接访问/myapp会返回404(除非你配置了根路径的资源)。
5. 隐性依赖冲突或初始化异常
虽然控制台没有明显报错,但可能存在隐性的类加载冲突或初始化失败:
- 去Tomcat的localhost.log或catalina.log里看看,有没有被忽略的WARN或DEBUG级别的异常;
- 确认Maven依赖中是否彻底排除了Jersey 1.x的相关jar包,比如
jersey-core、jersey-server等旧版本依赖,避免类加载混乱; - 验证jersey-spring3 2.25与Spring 5.0.5的兼容性,虽然官方标注兼容,但部分场景下可能需要微调依赖版本。
内容的提问来源于stack exchange,提问作者Dieguinho

