一尘不染

Contenty类型的边界被FormHttpMessageConverter覆盖

spring-mvc

我在Spring
Framework中使用FormHttpMessageConverter。为了通过restTemplate发送文件,我在项目中添加了FormHttpMessageConverter。

问题是服务器在哪里将文件询问的字符串加密为我的Content-type。我必须发送Content-type:multipart / form-
data的文件,但他们询问“ Content-type:multipart / form-data;”。和 boundary:XXXX

因此,我尝试在发送文件之前为边界值。但是,当RestTemplate.exchage()时,边界值被覆盖,原因是FormHttpMessageConverter。FormHttpMessageConverter捕获了转换请求。如果Content-
type为multipart / form-data,则FormHttpMessageConverter将此代码覆盖边界值。

https://github.com/spring-projects/spring-
framework/blob/5f4d1a4628513ab34098fa3f92ba03aa20fc4204/spring-
web/src/main/java/org/springframework/http/converter/FormHttpMessageConverter.java#L336

我找不到避免该问题的方法,因此我在链接处复制了该代码,并制作了一个文件“ xxxFormHttpMessageConverter”,并修改了“
writeMultipart”方法。

有人知道如何避免这种覆盖吗?


阅读 407

收藏
2020-06-01

共1个答案

一尘不染

在Spring启动中,您可以通过创建新的HttpMessageConverter bean来自定义边界。Spring Boot将自动替换旧的靴子。代码如下:

@Configuration
public class CustomerHttpMessageConverter {

    public static final String MY_BOUNDARY = "XXXXXXXX";

    @Bean
    public HttpMessageConverter<MultiValueMap<String, ?>> createCustomerFormHttpMessageConverter() {
        return new CustomerFormHttpMessageConverter();
    }

    static class CustomerFormHttpMessageConverter extends FormHttpMessageConverter {
        @Override
        protected byte[] generateMultipartBoundary() {
            return MY_BOUNDARY.getBytes(Charset.forName("UTF-8"));
        }
    }
}

您可以在此处找到更多信息。

2020-06-01