Spring Boot整合FF4j后MVC映射异常及Servlet失效问题求解
Spring Boot 2.1.2.RELEASE 整合 FF4j 1.8.0 问题解决方案
嘿,我之前在整合Spring Boot 2.1.2.RELEASE和FF4j 1.8.0的时候也踩过一模一样的坑,给你分享下亲测有效的解决方案:
问题1:启动失败,抛出entityManagerFactory创建失败的ArchiveException
这个问题核心是依赖冲突:FF4j-web自带的Thymeleaf 2.1.4和Spring Boot 2.x默认的Thymeleaf 3.x版本不兼容,加上javassist依赖的冲突导致JPA初始化失败。
解决步骤:
- 精准排除冲突依赖
在引入ff4j-web时,直接排除掉它自带的低版本Thymeleaf和javassist,避免和Spring Boot的依赖打架:<dependency> <groupId>org.ff4j</groupId> <artifactId>ff4j-web</artifactId> <version>1.8.0</version> <exclusions> <!-- 排除FF4j自带的低版本Thymeleaf --> <exclusion> <groupId>org.thymeleaf</groupId> <artifactId>thymeleaf</artifactId> </exclusion> <!-- 排除javassist避免JPA初始化冲突 --> <exclusion> <groupId>javassist</groupId> <artifactId>javassist</artifactId> </exclusion> </exclusions> </dependency> - 禁用Spring Boot的Thymeleaf自动配置
在你的Spring Boot主类上添加排除配置:@SpringBootApplication(exclude = {ThymeleafAutoConfiguration.class}) public class YourApplication { public static void main(String[] args) { SpringApplication.run(YourApplication.class, args); } } - 额外排除JPA依赖中的javassist(可选)
如果还是出现相关冲突,在spring-boot-starter-data-jpa中也排除javassist:<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jpa</artifactId> <exclusions> <exclusion> <groupId>org.javassist</groupId> <artifactId>javassist</artifactId> </exclusion> </exclusions> </dependency>
问题2:FF4j控制台静态资源加载后,访问/features出现No mapping警告
这个问题主要是Servlet注册路径错误,或者Spring MVC的资源映射覆盖了FF4j的请求路由,另外要注意FF4j的控制台和REST接口的路径区别。
解决步骤:
- 正确注册FF4j Servlet和过滤器
在你的FF4JWebConfiguration中,指定正确的URL匹配规则,同时添加FF4j控制台的静态资源映射:@Configuration public class FF4JWebConfiguration implements WebMvcConfigurer { @Bean public ServletRegistrationBean<FF4jServlet> ff4jServletRegistrationBean() { FF4jServlet ff4jServlet = new FF4jServlet(); // 注册FF4j Servlet,匹配所有/ff4j开头的请求 ServletRegistrationBean<FF4jServlet> registrationBean = new ServletRegistrationBean<>(ff4jServlet, "/ff4j/*"); registrationBean.setName("ff4jServlet"); registrationBean.setLoadOnStartup(1); return registrationBean; } @Bean public FilterRegistrationBean<FF4jFilter> ff4jFilterRegistrationBean() { FF4jFilter ff4jFilter = new FF4jFilter(); FilterRegistrationBean<FF4jFilter> registrationBean = new FilterRegistrationBean<>(ff4jFilter); registrationBean.addUrlPatterns("/ff4j/*"); return registrationBean; } @Override public void addResourceHandlers(ResourceHandlerRegistry registry) { // 你的自定义静态资源映射 registry.addResourceHandler("/static/**").addResourceLocations("classpath:/static/"); // 映射FF4j控制台的静态资源(FF4j-web的资源在classpath:/META-INF/resources/ff4j/下) registry.addResourceHandler("/ff4j/**").addResourceLocations("classpath:/META-INF/resources/ff4j/"); } } - 区分FF4j控制台和REST接口路径
- FF4j控制台的默认访问路径是
http://localhost:8080/ff4j,不是/features - 如果需要访问
/features的REST接口,需要额外引入ff4j-rest依赖:<dependency> <groupId>org.ff4j</groupId> <artifactId>ff4j-rest</artifactId> <version>1.8.0</version> </dependency>
- FF4j控制台的默认访问路径是
- 避免Spring MVC拦截FF4j请求
检查你的全局拦截器配置,如果有拦截所有请求的规则,要添加排除/ff4j/*和/features/*的规则。
内容的提问来源于stack exchange,提问作者Serhii
相关产品推荐
相关产品推荐

