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

SpringBoot2迁移至SpringBoot3后PrimeFaces FileUploadFilter适配问题

SpringBoot3迁移中PrimeFaces12 FileUploadFilter的javax/jakarta冲突解决

问题背景

你正将基于SpringBoot2、PrimeFaces12的应用迁移到SpringBoot3,遇到核心冲突:

  • SpringBoot3中Filter的API已从javax.servlet.Filter切换为jakarta.servlet.Filter
  • 你配置的FileUploadFilter Bean报错:FilterRegistrationBean.setFilter()要求传入Jakarta类型的Filter,但PrimeFaces12的org.primefaces.webapp.filter.FileUploadFilter仍基于javax API

你的Bean配置代码:

@Bean
public FilterRegistrationBean fileUploadFilter() {
    FilterRegistrationBean registration = new FilterRegistrationBean();
    registration.setFilter(new org.primefaces.webapp.filter.FileUploadFilter());
    registration.setName("PrimeFaces FileUpload Filter");
    return registration;
}

解决方案

方案1:升级PrimeFaces到Jakarta兼容版本

PrimeFaces从版本13开始全面支持Jakarta EE 9+(对应SpringBoot3的依赖规范),升级后FileUploadFilter会自动适配jakarta.servlet.Filter,无需额外修改Bean配置。

修改pom中的PrimeFaces依赖:

<dependency>
    <groupId>org.primefaces</groupId>
    <artifactId>primefaces</artifactId>
    <version>13.0.0</version> <!-- 或更高稳定版 -->
</dependency>

方案2:兼容适配器(无法升级PrimeFaces时)

如果暂时无法升级PrimeFaces,可自定义一个适配器Filter,将Jakarta Servlet API的请求/响应转换为javax版本,包装PrimeFaces的原有Filter:

import jakarta.servlet.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

public class JakartaFileUploadFilterAdapter implements Filter {

    private final org.primefaces.webapp.filter.FileUploadFilter delegate = 
        new org.primefaces.webapp.filter.FileUploadFilter();

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        delegate.init(new javax.servlet.FilterConfig() {
            @Override
            public String getFilterName() {
                return filterConfig.getFilterName();
            }

            @Override
            public String getInitParameter(String name) {
                return filterConfig.getInitParameter(name);
            }

            @Override
            public java.util.Enumeration<String> getInitParameterNames() {
                return filterConfig.getInitParameterNames();
            }

            @Override
            public javax.servlet.ServletContext getServletContext() {
                throw new UnsupportedOperationException("如需完整适配,需实现ServletContext桥接");
            }
        });
    }

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        delegate.doFilter(
            (HttpServletRequest) request,
            (HttpServletResponse) response,
            new javax.servlet.FilterChain() {
                @Override
                public void doFilter(javax.servlet.ServletRequest req, javax.servlet.ServletResponse res) throws IOException, javax.servlet.ServletException {
                    chain.doFilter((ServletRequest) req, (ServletResponse) res);
                }
            }
        );
    }

    @Override
    public void destroy() {
        delegate.destroy();
    }
}

然后修改你的Bean配置,使用适配器:

@Bean
public FilterRegistrationBean fileUploadFilter() {
    FilterRegistrationBean registration = new FilterRegistrationBean();
    registration.setFilter(new JakartaFileUploadFilterAdapter());
    registration.setName("PrimeFaces FileUpload Filter");
    return registration;
}

注意:适配器方案存在局限性,部分ServletContext相关功能可能需要额外桥接,优先推荐方案1。

方案3:统一依赖的Jakarta版本

检查你pom中的依赖,存在javax和Jakarta混合的情况,会导致更多冲突:

  • 替换javax.enterprise:cdi-api为Jakarta版本:
<dependency>
    <groupId>jakarta.enterprise</groupId>
    <artifactId>jakarta.enterprise.cdi-api</artifactId>
    <version>4.0.1</version>
</dependency>
  • 替换jakarta.platform:jakarta.jakartaee-api为Jakarta EE 9+版本:
<dependency>
    <groupId>jakarta.platform</groupId>
    <artifactId>jakarta.jakartaee-api</artifactId>
    <version>9.1.0</version>
    <scope>provided</scope>
</dependency>

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 23:53:07