首页 > 网站 > 建站经验 > 正文

自定义content-type及自动匹配HttpMessageConverter

2019-11-02 13:51:26
字体:
来源:转载
供稿:网友
  有时候在文件管理模块中有用到自定义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 ,
  在服务端配置文件加入下面配置
  Java代码  
  <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
  Java代码  
  ByteArrayHttpMessageConverter converter = new ByteArrayHttpMessageConverter();
  converter.setSupportedMediaTypes(Collections.singletonList(MediaType.valueOf("application/bytes")));
  restTemplate.setMessageConverters((List)Collections.singletonList(converter));
  通过设置ClientHttpRequestInterceptor
  Java代码  
  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));
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表