接入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
相关产品推荐
相关产品推荐

