如何在独立Jetty 9.4服务器上配置Resteasy并解决接口404问题
独立Jetty 9.4 + Resteasy 404问题修复方案
已确认的配置错误点
- 路径重复映射:web.xml中配置了Resteasy Servlet拦截
/api/*,同时设置了resteasy.servlet.mapping.prefix = /api,还在资源类的@Path注解上加了/api前缀,三层路径叠加导致实际访问路径和预期不符 - 扫描规则冲突:同时开启Resteasy自动扫描和Guice集成,Resteasy的自动扫描规则会和Guice管理的Bean扫描冲突,导致资源类没有被正确注册
- Filter映射规则问题:GuiceFilter的映射范围不足,没有覆盖所有请求路径,导致Guice托管的资源类无法被正确路由
具体修改步骤
1. 修正web.xml配置
删除重复的路径前缀配置,关闭Resteasy自动扫描(改用Guice管理资源注册),调整Filter映射:
<web-app xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" metadata-complete="false" version="3.0" > <context-param> <param-name>appName</param-name> <param-value>eyerep</param-value> </context-param> <!-- 关闭Resteasy自动扫描,改为Guice管理资源注册 --> <context-param> <param-name>resteasy.scan</param-name> <param-value>false</param-value> </context-param> <context-param> <param-name>resteasy.guice.modules</param-name> <param-value>com.google.inject.servlet.ServletModule,com.tura.eyerep.guice.EyerepGuiceModule</param-value> </context-param> <context-param> <param-name>resteasy.guice.holder</param-name> <param-value>com.tura.eyerep.guice.Guice</param-value> </context-param> <listener> <listener-class>com.tura.eyerep.guice.resteasy.MyGuiceResteasyBootstrapServletContextListener </listener-class> </listener> <listener> <listener-class>com.tura.eyerep.servlet.StartupShutdownListener</listener-class> </listener> <filter> <filter-name>GuiceFilter</filter-name> <filter-class>com.google.inject.servlet.GuiceFilter</filter-class> </filter> <servlet> <servlet-name>Resteasy</servlet-name> <servlet-class>org.jboss.resteasy.plugins.server.servlet.HttpServlet30Dispatcher</servlet-class> <async-supported>true</async-supported> </servlet> <!-- 调整GuiceFilter映射覆盖所有请求 --> <filter-mapping> <filter-name>GuiceFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <servlet-mapping> <servlet-name>Resteasy</servlet-name> <url-pattern>/api/*</url-pattern> <url-pattern>/auth/*</url-pattern> </servlet-mapping> <session-config> <session-timeout>10</session-timeout> </session-config> </web-app>
2. 修正资源类路径
删除类级别@Path的重复前缀:
// 删除类层级的/api前缀,避免和Servlet映射的/api/*叠加 @Path("/") public class ExportDataApi { @GET @Path("/data/export/repName/{repId}") public Response getRepName(@PathParam("repId") String repId) { // 原有业务逻辑 } }
3. 显式在Guice模块中注册资源类
在EyerepGuiceModule中显式绑定资源类,避免扫描丢失:
public class EyerepGuiceModule extends AbstractModule { @Override protected void configure() { // 显式绑定REST资源类 bind(ExportDataApi.class); // 其他原有绑定逻辑 } }
4. 验证访问路径
修改后正确的访问路径为:http://你的Jetty服务地址/eyerep-data/api/data/export/repName/xxx
5. 依赖校验
确保WAR包中包含以下Resteasy必要依赖,且没有和Jetty自带的库冲突:
- resteasy-jaxrs
- resteasy-guice
- resteasy-servlet-initializer
- javax.ws.rs-api
不要引入JBoss专属的依赖包,避免类加载冲突
异常排查
如果仍然返回404,开启Jetty的debug日志,搜索registered resources关键字,确认你的资源类是否被正确注册到Resteasy的资源列表中。
内容的提问来源于stack exchange,提问作者pbuchheit
相关产品推荐
相关产品推荐

