国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 網站 > 建站經驗 > 正文

自定義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));
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 虎林市| 交城县| 邹城市| 茶陵县| 高邮市| 金溪县| 双柏县| 连州市| 临漳县| 固镇县| 闻喜县| 含山县| 兴业县| 深泽县| 交城县| 陇川县| 松江区| 泽州县| 和林格尔县| 广东省| 谢通门县| 临高县| 南开区| 旌德县| 西安市| 讷河市| 清远市| 靖江市| 四平市| 巢湖市| 丹阳市| 大化| 湟源县| 屏东市| 揭阳市| 南江县| 林西县| 香港| 台中县| 海阳市| 上林县|