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会先处理所有请求:
- 如果Jersey能匹配到对应的资源/接口,直接返回响应;
- 如果匹配不到,原本应该返回404,然后触发转发,让Spring的DispatcherServlet处理静态资源。
但你定义的ExceptionMapper<RuntimeException>会捕获Jersey处理请求过程中产生的所有RuntimeException(包括找不到资源时抛出的异常),直接返回了JSON错误响应,跳过了404转发逻辑,导致Spring的静态资源处理器根本没机会处理这个请求。
去掉@Provider注解后,这个异常处理器不生效,Jersey遇到无法处理的请求会正常返回404,触发转发,静态资源就能被正常访问了。
内容的提问来源于stack exchange,提问作者Rafael Manzoni
相关产品推荐
相关产品推荐

