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

如何在独立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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 20:36:03