SpringBoot2迁移至SpringBoot3后PrimeFaces FileUploadFilter适配问题
SpringBoot3迁移中PrimeFaces12 FileUploadFilter的javax/jakarta冲突解决
问题背景
你正将基于SpringBoot2、PrimeFaces12的应用迁移到SpringBoot3,遇到核心冲突:
- SpringBoot3中Filter的API已从
javax.servlet.Filter切换为jakarta.servlet.Filter - 你配置的
FileUploadFilterBean报错: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
相关产品推荐
相关产品推荐

