【问题标题】:Boundary in Contenty-type is overwritten by FormHttpMessageConverterContent-type 中的边界被 FormHttpMessageConverter 覆盖
【发布时间】:2017-07-30 14:46:11
【问题描述】:

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

问题是服务器将文件询问字符串加密的内容类型我。 我必须使用 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”。

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

【问题讨论】:

  • 在您链接的类中,generateMultipartBoundary 方法是protected,似乎正在做您想做的事。您仍然需要扩展该类,但只需使用固定的 String 覆盖这一方法,例如,"myCustomBoundary".getBytes() 应该可以工作。
  • 确实如此。我错过了generateMultipartBoundary() 受保护。谢谢!我会试试的。
  • 好的。我试过这种方式。有用。这很有帮助。但是,通常每次调用时都会随机生成边界值。我不能确定这是正确的方法...

标签: java spring spring-mvc


【解决方案1】:

在 Spring Boot 中,您可以通过创建新的 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"));
        }
    }
}

您可以找到更多信息here

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-10-27
    • 2012-03-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多