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

Spring Boot集成Jersey后静态资源无法访问问题求助

问题分析与解决方案

你的问题核心在于全局捕获RuntimeException的ExceptionMapper拦截了Jersey的404转发逻辑,导致静态资源请求无法被Spring的资源处理器接手处理。

解决方案1:缩小异常捕获范围(推荐)

把ExceptionMapper的泛型从RuntimeException改成你自定义的DefaultException,这样只会处理业务抛出的自定义异常,不会干扰Jersey的静态资源转发流程:

package com.product.api.endpoint;

import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
import javax.ws.rs.ext.ExceptionMapper;
import javax.ws.rs.ext.Provider;
import org.springframework.stereotype.Component;
import com.product.api.entity.DefaultError;
import com.product.api.exception.DefaultException;

@Component
@Provider
public class DefaultExceptionHandler implements ExceptionMapper<DefaultException> {
    @Override
    public Response toResponse(DefaultException ex) {
        return Response.status(ex.getCode())
                .entity(new DefaultError(ex.getMessage()))
                .type(MediaType.APPLICATION_JSON)
                .build();
    }
}

解决方案2:让Jersey跳过静态资源路径处理

如果你确实需要捕获所有RuntimeException,可以配置Jersey的静态资源过滤规则,让它直接跳过静态资源路径的处理,转发给Spring:

在你的Jersey配置类中添加以下属性:

import org.glassfish.jersey.servlet.ServletProperties;

// ... 其他配置逻辑
property(ServletProperties.FILTER_STATIC_CONTENT_REGEX, "/.*\\.(html|css|js|png|jpg)$");
// 或者匹配static/public目录下的所有资源:"/(static|public)/.*"

原因解释

当你开启ServletProperties.FILTER_FORWARD_ON_404=true时,Jersey作为Filter会先处理所有请求:

  1. 如果Jersey能匹配到对应的资源/接口,直接返回响应;
  2. 如果匹配不到,原本应该返回404,然后触发转发,让Spring的DispatcherServlet处理静态资源。

但你定义的ExceptionMapper<RuntimeException>会捕获Jersey处理请求过程中产生的所有RuntimeException(包括找不到资源时抛出的异常),直接返回了JSON错误响应,跳过了404转发逻辑,导致Spring的静态资源处理器根本没机会处理这个请求。

去掉@Provider注解后,这个异常处理器不生效,Jersey遇到无法处理的请求会正常返回404,触发转发,静态资源就能被正常访问了。

内容的提问来源于stack exchange,提问作者Rafael Manzoni

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 08:50:51