Jersey POST API未携带Content-Length时无法工作求助
首先,你遇到的java.lang.IllegalStateException: Unable to process parts as no multi-part configuration has been provided异常,核心原因是:当请求不携带Content-Length头时,Tomcat会尝试使用Servlet 3.0的原生multipart处理机制,但你的应用缺少对应的multipart配置,导致无法正确解析分块传输的请求体。下面是具体的解决步骤:
1. 配置Servlet的Multipart支持
Tomcat处理chunked编码(无Content-Length)的multipart请求时,必须明确配置multipart解析规则。你可以通过两种方式配置:
方式一:Spring Boot项目配置
在自定义的DispatcherServlet Bean中添加multipart配置:
@Configuration public class ServletConfig { @Bean public DispatcherServlet dispatcherServlet() { DispatcherServlet servlet = new DispatcherServlet(); // 设置multipart参数:临时路径、单文件大小、总请求大小等 servlet.setMultipartConfig(new MultipartConfigElement( null, 52428800, // 单个文件最大50MB 52428800, // 请求总大小最大50MB 0 )); return servlet; } }
方式二:传统web.xml配置
如果是非Spring Boot项目,在web.xml中给DispatcherServlet添加multipart配置:
<servlet> <servlet-name>dispatcherServlet</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <multipart-config> <max-file-size>52428800</max-file-size> <max-request-size>52428800</max-request-size> </multipart-config> </servlet>
2. 确保引入Jersey Multipart依赖
你的接口使用了@FormDataParam,必须引入Jersey的multipart处理依赖。如果用Maven,在pom.xml中添加:
<dependency> <groupId>org.glassfish.jersey.media</groupId> <artifactId>jersey-media-multipart</artifactId> <version>你的Jersey对应版本</version> </dependency>
3. 注册Jersey的MultipartFeature
在Jersey的配置类中,必须注册MultipartFeature,让Jersey接管multipart请求的解析,而不是依赖Tomcat的原生处理:
@Configuration public class JerseyConfig extends ResourceConfig { public JerseyConfig() { register(FileUpload.class); register(MultipartFeature.class); // 关键:注册multipart处理Feature // 其他接口或Feature注册... } }
补充说明:为什么带Content-Length时正常?
当请求携带Content-Length头时,Tomcat可以直接读取指定长度的完整请求体,Jersey的multipart解析器能直接处理;但当没有该头时,请求会以chunked编码分块传输,此时Tomcat需要依赖预先配置好的multipart解析规则来处理分块数据,缺失配置就会抛出异常。
内容的提问来源于stack exchange,提问作者Jayesh Dhandha

