【问题标题】:Spring Boot 2.x reports java.lang.IllegalStateException: Unable to process parts as no multi-part configuration has been providedSpring Boot 2.x 报告 java.lang.IllegalStateException: Unable to process parts 因为没有提供多部分配置
【发布时间】:2021-02-10 10:55:56
【问题描述】:

我注意到这里的多部分请求存在一个奇怪的问题。

下面是 Spring Boot 2.4.2 中使用的 Jersey2 实现:

@POST
@Consumes(MediaType.MULTIPART_FORM_DATA)
@Produces({MediaType.MULTIPART_FORM_DATA, MediaType.APPLICATION_JSON})
public void upload(@FormDataParam("params") MyPojo req,
        @FormDataParam("file") FormDataBodyPart file, @Context HttpHeaders headers, @Suspended AsyncResponse ar)
{
    ...
}

并遵循 Spring Boot 依赖项:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-jersey</artifactId>
</dependency>
<dependency>
    <groupId>org.glassfish.jersey.media</groupId>
    <artifactId>jersey-media-multipart</artifactId>
</dependency>
<dependency>
    <groupId>org.glassfish.jersey.media</groupId>
    <artifactId>jersey-media-json-jackson</artifactId>
</dependency>

我能够使用 Postman 成功上传 JSON 和文件(作为 multipart/form-data),但来自 Java 客户端的相同请求会引发以下错误:

Caused by: org.springframework.web.multipart.MultipartException: Failed to parse multipart servlet request; nested exception is java.lang.IllegalStateException: Unable to process parts as no multi-part configuration has been provided

SO 上的 article 说我们需要添加一个 CommonsMultipartResolver 但为什么它在 Postman 客户端上运行良好??

感谢任何提示或建议,谢谢。

更新 Java Apache 客户端代码:

        final Document document = getDocument(documentId);
        final String requestParams = getRequestParams(document);
        final String documentContentType = document.getContentType();
        final URL endpoint = getServiceEndpoint();
        
        final MultipartEntityBuilder entityBuilder = MultipartEntityBuilder.create().addTextBody(REQUEST_PARAMS_PARAMETER_NAME, requestParams, ContentType.APPLICATION_JSON);
        if (isSendDocument() && documentFile != null) {
            entityBuilder.addBinaryBody(DOCUMENT_CONTENT_PARAMETER_NAME, documentFile, ContentType.parse(documentContentType), document.getContentType());
        }
        
        final HttpEntity reqestEntity = entityBuilder.build();
        connection = (HttpURLConnection)endpoint.openConnection();
        connection.setAllowUserInteraction(false);
        connection.setConnectTimeout(getConnectionTimeout());
        connection.setReadTimeout(getReadTimeout());
        connection.setUseCaches(false);
        connection.setDoOutput(true);
        connection.setRequestMethod("POST");
        connection.addRequestProperty(X_REQUESTED_WITH_HEADER_NAME, "XMLHttpRequest");
        connection.addRequestProperty(X_REQUESTED_BY_HEADER_NAME, "XMLHttpRequest");
        connection.addRequestProperty(ACCEPT_HEADER_NAME, ContentType.APPLICATION_JSON.getMimeType());
        connection.addRequestProperty(CONTENT_TYPE_HEADER_NAME, reqestEntity.getContentType().getValue());
        outStream = connection.getOutputStream();
        reqestEntity.writeTo(outStream);
        outStream.flush();

【问题讨论】:

  • 仔细检查标题,比较邮递员和实际的 java-client 调用
  • 您使用 Postman 和 Java 客户端发出的请求是否相同? MultipartException 是 Spring Framework 异常,这表明 Jersey 没有处理 Java 客户端发出的请求。
  • 你可以尝试使用spring.servlet.multipart.enabled = true禁用 Spring 多部分支持
  • @PaulSamsotha 对不起,我不明白你的建议。我正在使用 Jersey 2 实现来公开 REST API(尽管它在 Spring Boot 应用程序上运行)。如果这是 Spring 多部分支持的问题,邮递员的请求是如何工作的?我还用 Java 客户端更新了这个问题以供参考。谢谢。
  • 抱歉,我的评论应该是禁用它。我只是从 SO 上的帖子中复制并粘贴它。我忘了把它改成假的。对此感到抱歉。

标签: java spring spring-boot jersey-2.0


【解决方案1】:

由于我们打算由 Jersey servlet 处理多部分,@PaulSamsotha 建议禁用 Spring Boot 的多部分处理 spring.servlet.multipart.enabled = false 解决了问题中发布的原始问题 - “java.lang.IllegalStateException: Unable to process parts as no已提供多部分配置”。

后来,我仅在使用 Apache 客户端时收到 Http 400 错误,这是由于 JSON 有效负载格式错误。感谢大家的支持。

【讨论】:

    猜你喜欢
    • 2014-06-29
    • 2017-02-08
    • 2018-04-25
    • 2016-08-16
    • 2017-04-17
    • 1970-01-01
    • 2020-01-09
    • 1970-01-01
    • 2014-08-26
    相关资源
    最近更新 更多