我在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”方法。
有人知道如何避免这种覆盖吗?
在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")); } } }
您可以在此处找到更多信息。