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

接入Spring Boot后h:inputFile的setter与action方法均无法触发

问题根因

这个问题的核心原因是Spring Boot默认开启的multipart请求解析器会提前处理multipart/form-data类型的请求,导致JSF的FacesServlet无法读取到原始的上传请求内容,因此无法完成文件属性绑定和action方法触发。


解决方案

1. 禁用Spring Boot自带的multipart自动配置

在application.properties配置文件中添加如下配置:

spring.servlet.multipart.enabled=false

如果使用application.yml则对应配置为:

spring:
  servlet:
    multipart:
      enabled: false

2. 为FacesServlet添加multipart支持

Spring Boot注册FacesServlet时默认未开启文件上传支持,需要手动添加MultipartConfig配置,新增如下配置类即可:

import org.springframework.boot.web.servlet.ServletRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import javax.faces.webapp.FacesServlet;
import javax.servlet.MultipartConfigElement;

@Configuration
public class JsfConfig {

    @Bean
    public ServletRegistrationBean<FacesServlet> facesServletRegistration() {
        ServletRegistrationBean<FacesServlet> registration = new ServletRegistrationBean<>(new FacesServlet(), "*.xhtml");
        registration.setLoadOnStartup(1);
        // 以下参数可根据业务需求调整:临时存储路径、单文件上限、总请求上限、内存缓存阈值
        registration.setMultipartConfig(new MultipartConfigElement(
                System.getProperty("java.io.tmpdir"),
                10 * 1024 * 1024,
                50 * 1024 * 1024,
                1024 * 1024
        ));
        return registration;
    }
}

3. 清理冲突配置

检查项目中是否存在手动注册的MultipartResolver类实例,如果有需要删除该Bean定义,避免请求被提前解析。


额外检查点

你提供的视图代码中h:form的prependid属性存在大小写错误,正确写法为prependId,不过该属性不影响文件上传逻辑,可按需修正。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.15 23:15:08