springmvc通过自定义http accept或者content-type自动选择HttpMessageConverter

本文介绍了如何在SpringMVC中通过自定义http accept和content-type来自动选择合适的HttpMessageConverter。在解决文件管理模块中自定义content-type问题时,文章详细讲解了RestTemplate设置headers的三种方式,并着重阐述了在处理返回byte[]时,如何配置Content-Type为"application/bytes",以及客户端和服务端的相关设置。同时,针对匹配错误的HttpMessageConverter问题,提出了通过设置HttpMessageConverters和ClientHttpRequestInterceptor来解决。
摘要由CSDN通过智能技术生成
在项目的文件管理模块中有用到自定义content-type,以及自动匹配HttpMessageConverter,
某童鞋 在解决这些问题的时候遇到了点困难

今天研究了半天分享下 springmvc通过自定义http accept或者content-type自动选择HttpMessageConverter


RestTmplate设置headers:
restTemplate设置headers有三种方式
1、通过设置MessageConverters
2、通过设置拦截器(ClientHttpRequestInterceptor)
3、通过配置HttpHeaders
一般的restTemplate请求都可以设置HttpHeaders,因此HttpHeaders是比较容易想到的。
但使用http get方式的时候restTemplate没有设置HttpHeaders的地方
文件管理器模块有个功能是直接获取文件的字节数组返回给客户端,以提高javascript客户端的解析速度
返回byte[] 需要有相应解析器:ByteArrayHttpMessageConverter。它对应的Content-Type是application/octet-stream
而我们用的是自定义的:application/bytes ,
在服务端配置文件加入下面配置

<bean id="byteConverter" class="org.springframework.http.converter.ByteArrayHttpMessageConverter">
<property name="supportedMediaTypes">
<list>
<value>application/bytes</value>
</list>
</property>
</bean>

<bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter ">
<property name="messageConverters">
<list>
<ref bean="jsonConverter" />
//信息转换器放入适配器中
<ref bean="byteConverter" />
</list>
</property>
</bean>

然后在方法上设置headers
@RequestMapping(value = "/public/{appId}/{fileName}", method = RequestMethod.GET, headers = { "content-type=application/bytes" })
服务端的配置完成

客户端restTemplate不能使用HttpHeaders,只能用后两种
RestTemplate初始化的时候会加入5个信息转换器,其中就有ByteArrayHttpMessageConverter,
这样到服务端加上自己设置的就有6种类型,在自动匹配HttpMessageConverter会匹配到不是自己想要的转换器,比如这6个在getBytes这个功能的测试中,会匹配成json的转换器。
为避免这样就在RestTemplate请求前,用自定义Content-Type的ByteArrayHttpMessageConverter覆盖默认的配置

通过设置HttpMessageConverters

ByteArrayHttpMessageConverter converter = new ByteArrayHttpMessageConverter();

converter.setSupportedMediaTypes(Collections.singletonList(MediaType.valueOf("application/bytes")));

restTemplate.setMessageConverters((List)Collections.singletonList(converter));




通过设置ClientHttpRequestInterceptor

ClientHttpRequestInterceptor interceptor= new ClientHttpRequestInterceptor() {
@Override
public ClientHttpResponse intercept(HttpRequest request, byte[] body, ClientHttpRequestExecution execution)
throws IOException {
HttpRequestWrapper wrapper = new HttpRequestWrapper(request);
MediaType mt=MediaType.valueOf("application/bytes");
wrapper.getHeaders().setContentType(mt);
wrapper.getHeaders().setAccept((List)Collections.singletonList(mt));
return execution.execute(wrapper, body);
}
};
restTemplate.setInterceptors(Collections.singletonList(interceptor));
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值