Spring与Jersey构建的REST API返回404错误求助
咱们一步步来定位这个404问题,从配置到代码逐一排查:
1. 补全Jersey SpringServlet的包扫描配置
你当前的web.xml里的SpringServlet缺少了REST资源类扫描的关键配置——Jersey根本不知道要去哪里找你的UsersService。需要在servlet节点里添加初始化参数:
<servlet> <servlet-name>Jersey Spring Web Application</servlet-name> <servlet-class>com.sun.jersey.spi.spring.container.servlet.SpringServlet</servlet-class> <!-- 新增:指定REST资源所在的包 --> <init-param> <param-name>com.sun.jersey.config.property.packages</param-name> <param-value>com.persistent.rest</param-value> </init-param> </servlet>
这个参数会告诉Jersey去扫描com.persistent.rest包下所有带@Path等Jersey注解的类。
2. 检查Spring配置文件applicationContext.xml
确保你的Spring配置开启了组件扫描,这样Spring才能识别并管理UsersService上的@Component注解:
<!-- 扫描REST服务所在的包 --> <context:component-scan base-package="com.persistent.rest" /> <!-- 开启事务注解支持,因为你用到了@Transactional --> <tx:annotation-driven />
如果没有这段配置,Spring不会把UsersService纳入容器,Jersey也就无法获取到这个资源实例。
3. 补全pom.xml的依赖(你的pom内容不完整)
依赖缺失或版本冲突会导致资源无法正常加载,需要确保Jersey和Spring的集成依赖完整,示例如下:
<dependencies> <!-- Spring核心依赖 --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-web</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-tx</artifactId> <version>${spring.version}</version> </dependency> <!-- Jersey核心及Spring集成依赖 --> <dependency> <groupId>com.sun.jersey</groupId> <artifactId>jersey-server</artifactId> <version>${jersey.version}</version> </dependency> <dependency> <groupId>com.sun.jersey.contribs</groupId> <artifactId>jersey-spring</artifactId> <version>${jersey.version}</version> <!-- 排除冲突的Spring依赖,避免版本不一致 --> <exclusions> <exclusion> <groupId>org.springframework</groupId> <artifactId>spring</artifactId> </exclusion> <exclusion> <groupId>org.springframework</groupId> <artifactId>spring-core</artifactId> </exclusion> </exclusions> </dependency> <!-- Hibernate相关依赖(你代码里用到了Hibernate) --> <dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-core</artifactId> <version>3.6.10.Final</version> <!-- 和Spring 3.0.5版本匹配 --> </dependency> </dependencies>
4. 验证请求URL与配置的匹配性
你的servlet-mapping是/FjordRestApi/*,UsersService的@Path("/us"),方法的@Path("/getUsers"),所以完整请求URL确实是http://localhost:8282/FjordRestApi/us/getUsers——但要确认Jetty确实启动在8282端口,war包也正确部署了。
5. 查看服务器启动日志
启动Jetty时,留意控制台日志,如果你看到类似下面的内容,说明Jersey成功扫描到了你的资源:
INFO: Scanning for root resource and provider classes in the packages: com.persistent.rest INFO: Root resource classes found: class com.persistent.rest.UsersService
如果没有这些日志,说明Jersey没找到你的资源类,回到第一步重新检查配置。
6. 确认事务配置完整性
你的UsersService用了@Transactional,需要确保applicationContext.xml里配置了SessionFactory和事务管理器:
<bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean"> <!-- 配置数据源、Hibernate属性、实体映射等 --> </bean> <bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager"> <property name="sessionFactory" ref="sessionFactory" /> </bean>
虽然这部分问题通常返回500而非404,但配置错误可能导致资源初始化失败,也值得检查。
按照以上步骤逐一排查,应该能解决这个404问题。
内容的提问来源于stack exchange,提问作者kfir

