使用resteasy-servlet-spring-boot-starter与Spring Boot提供静态文件的问题
解决Resteasy + Spring Boot 静态资源访问问题
异常翻译
原异常信息:Could not find resource for full path:......
翻译为:无法找到完整路径对应的资源:......
解决方案
1. 让Spring Boot识别自定义静态资源目录
Spring Boot默认不会扫描/META-INF/resources/api作为静态资源目录,需在配置文件中添加该目录,同时保留默认静态资源路径,避免影响其他资源访问:
application.yml 配置
spring: web: resources: static-locations: classpath:/META-INF/resources/api/, classpath:/META-INF/resources/, classpath:/resources/, classpath:/static/, classpath:/public/
application.properties 配置
spring.web.resources.static-locations=classpath:/META-INF/resources/api/,classpath:/META-INF/resources/,classpath:/resources/,classpath:/static/,classpath:/public/
2. 限制Resteasy的拦截范围
默认情况下Resteasy的HttpServlet30Dispatcher会拦截所有请求(/*),导致静态资源请求被Resteasy接管而无法找到资源。需修改Resteasy的映射前缀,让它只处理API请求:
方式一:配置文件直接设置
resteasy.servlet.mapping.prefix=/api
方式二:配置类设置
import org.jboss.resteasy.springboot.ResteasyProperties; import org.springframework.boot.context.properties.EnableConfigurationProperties; import org.springframework.context.annotation.Configuration; @Configuration @EnableConfigurationProperties(ResteasyProperties.class) public class ResteasyConfig { public ResteasyConfig(ResteasyProperties resteasyProperties) { resteasyProperties.setServletMappingPrefix("/api"); } }
3. 使用FilterDispatcher时的额外配置
如果必须使用FilterDispatcher,需要手动注册Spring Boot的默认Servlet来处理静态资源,同时调整Filter的拦截路径:
import org.springframework.boot.web.servlet.ServletRegistrationBean; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.web.servlet.DispatcherServlet; import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry; import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; @Configuration public class WebConfig implements WebMvcConfigurer { @Override public void addResourceHandlers(ResourceHandlerRegistry registry) { // 映射/api路径下的请求到自定义静态资源目录 registry.addResourceHandler("/api/**") .addResourceLocations("classpath:/META-INF/resources/api/"); } @Bean public ServletRegistrationBean<DispatcherServlet> defaultDispatcherServlet() { DispatcherServlet servlet = new DispatcherServlet(); ServletRegistrationBean<DispatcherServlet> registration = new ServletRegistrationBean<>(servlet, "/"); registration.setName("default"); registration.setLoadOnStartup(1); return registration; } }
同时确保FilterDispatcher的拦截路径设置为/api/**,避免拦截静态资源请求。
内容的提问来源于stack exchange,提问作者ssingh
相关产品推荐
相关产品推荐

