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

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初始化失败。

解决步骤:

  1. 精准排除冲突依赖
    在引入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>
    
  2. 禁用Spring Boot的Thymeleaf自动配置
    在你的Spring Boot主类上添加排除配置:
    @SpringBootApplication(exclude = {ThymeleafAutoConfiguration.class})
    public class YourApplication {
        public static void main(String[] args) {
            SpringApplication.run(YourApplication.class, args);
        }
    }
    
  3. 额外排除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接口的路径区别。

解决步骤:

  1. 正确注册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/");
        }
    }
    
  2. 区分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>
      
  3. 避免Spring MVC拦截FF4j请求
    检查你的全局拦截器配置,如果有拦截所有请求的规则,要添加排除/ff4j/*和/features/*的规则。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.13 06:36:57