最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

使用Spring Cloud Feign上傳文件的示例

 更新時(shí)間:2017年12月16日 09:03:50   作者:周立  
本篇文章主要介紹了使用Spring Cloud Feign上傳文件的示例,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧

最近經(jīng)常有人問Spring Cloud Feign如何上傳文件。有團(tuán)隊(duì)的新成員,也有其他公司的兄弟。本文簡(jiǎn)單做個(gè)總結(jié)——

早期的Spring Cloud中,F(xiàn)eign本身是沒有上傳文件的能力的(1年之前),要想實(shí)現(xiàn)這一點(diǎn),需要自己去編寫Encoder 去實(shí)現(xiàn)上傳?,F(xiàn)在我們幸福了很多。因?yàn)镕eign官方提供了子項(xiàng)目feign-form ,其中實(shí)現(xiàn)了上傳所需的 Encoder 。

注:筆者測(cè)試的版本是Edgware.RELEASE。Camden、Dalston同樣適應(yīng)本文所述。

加依賴

<dependency>
 <groupId>io.github.openfeign.form</groupId>
 <artifactId>feign-form</artifactId>
 <version>3.0.3</version>
</dependency>
<dependency>
 <groupId>io.github.openfeign.form</groupId>
 <artifactId>feign-form-spring</artifactId>
 <version>3.0.3</version>
</dependency>


編寫Feign Client

@FeignClient(name = "ms-content-sample", configuration = UploadFeignClient.MultipartSupportConfig.class)
public interface UploadFeignClient {
 @RequestMapping(value = "/upload", method = RequestMethod.POST,
   produces = {MediaType.APPLICATION_JSON_UTF8_VALUE},
   consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
 @ResponseBody
 String handleFileUpload(@RequestPart(value = "file") MultipartFile file);
 class MultipartSupportConfig {
  @Bean
  public Encoder feignFormEncoder() {
   return new SpringFormEncoder();
  }
 }
}

如代碼所示,在這個(gè)Feign Client中,我們引用了配置類MultipartSupportConfig ,在MultipartSupportConfig 中,我們實(shí)例化了SpringFormEncoder 。這樣這個(gè)Feign Client就能夠上傳啦。

注意點(diǎn)

@RequestMapping(value = "/upload", method = RequestMethod.POST,
   produces = {MediaType.APPLICATION_JSON_UTF8_VALUE},
   consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
中的produeces 、consumes 不能少;

接口定義中的注解@RequestPart(value = "file") 不能寫成@RequestParam(value = "file" 。

最好將Hystrix的超時(shí)時(shí)間設(shè)長(zhǎng)一點(diǎn),例如5秒,否則可能文件還沒上傳完,Hystrix就超時(shí)了,從而導(dǎo)致客戶端側(cè)的報(bào)錯(cuò)。

SpringCloud中使用Feign的坑

示例如下:

@FeignClient("service-resource")
//@RequestMapping("/api/test")
public interface TestResourceItg {

 @RequestMapping(value = "/api/test/raw", method = RequestMethod.POST, consumes = "application/x-www-form-urlencoded")
 public String raw1(@PathVariable("subject") String subject, // 標(biāo)題
     @RequestParam("content") String content); // 內(nèi)容

}

說明:

*使用RequestMapping中的consumes指定生成的請(qǐng)求的Content-Type
*RequestParam指定的參數(shù)會(huì)拼接在URL之后,如: ?name=xxx&age=18
*PathVariable指定的參數(shù)會(huì)放到一個(gè)LinkedHashMap<String, ?>傳入到feign的Encoder中進(jìn)行處理,而在Spring中實(shí)現(xiàn)了該接口的Encoder為SpringEncoder,而該實(shí)現(xiàn)又會(huì)使用Spring中的HttpMessageConverter進(jìn)行請(qǐng)求體的寫入。

坑:

*不要在接口類名上使用RequestMapping,雖然可以使用,但同時(shí)SpringMVC會(huì)把該接口的實(shí)例當(dāng)作Controller開放出去,這個(gè)可以在啟動(dòng)的Mapping日志中查看到
*使用默認(rèn)的SpringEncoder,在不指定consumes時(shí),PathVariable中的參數(shù)會(huì)生成JSON字符串發(fā)送,且默認(rèn)情況下不支持Form表單的生成方式,原因?yàn)?FormHttpMessageConverter只能處理MultiValueMap,而使用PathVariable參數(shù)被放在了HashMap中。默認(rèn)更不支持文件上傳。其實(shí)已經(jīng)有支持處理各種情況的HttpMessageConverter存在。

填坑:

*支持Form表單提交:只需要編寫一個(gè)支持Map的FormHttpMessageConverter即可,內(nèi)部可調(diào)用FormHttpMessageConverter的方法簡(jiǎn)化操作。
*支持文件上傳:只需要把要上傳的文件封裝成一個(gè)Resource(該Resource一定要實(shí)現(xiàn)filename接口,這個(gè)是把請(qǐng)求參數(shù)解析成文件的標(biāo)識(shí)),使用默認(rèn)的ResourceHttpMessageConverter處理即可。
*支持處理MultipartFile參數(shù):編寫一個(gè)支持MultipartFile的MultipartFileHttpMessageConverter即可,內(nèi)部可調(diào)用ResourceHttpMessageConverter實(shí)現(xiàn),同時(shí)注意需要將其添加至FormHttpMessageConverter的Parts中,并重寫FormHttpMessageConverter的getFilename方法支持從MultipartFile中獲取filename
*所有的HttpMessageConverter直接以@Bean的方式生成即可,spring會(huì)自動(dòng)識(shí)別添加

完美支持表單和文件上傳:

方案一:

使用附件中的MapFormHttpMessageConverter.java和MultipartFileHttpMessageConverter.java

在Spring中進(jìn)行如下配置即可

@Bean
public MapFormHttpMessageConverter mapFormHttpMessageConverter(MultipartFileHttpMessageConverter multipartFileHttpMessageConverter) {
 MapFormHttpMessageConverter mapFormHttpMessageConverter = new MapFormHttpMessageConverter();
 mapFormHttpMessageConverter.addPartConverter(multipartFileHttpMessageConverter);
 return mapFormHttpMessageConverter;
}

@Bean
public MultipartFileHttpMessageConverter multipartFileHttpMessageConverter() {
 return new MultipartFileHttpMessageConverter();
}

方案二:

使用FeignSpringFormEncoder.java

在Spring中配置如下:

@Bean
public Encoder feignEncoder(ObjectFactory<HttpMessageConverters> messageConverters) {
 return new FeignSpringFormEncoder(messageConverters);
} 

推薦使用方案一

方案二為參考https://github.com/pcan/feign-client-test而來,未測(cè)

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • java 中HashMap實(shí)現(xiàn)原理深入理解

    java 中HashMap實(shí)現(xiàn)原理深入理解

    這篇文章主要介紹了java 中HashMap實(shí)現(xiàn)原理深入理解的相關(guān)資料,需要的朋友可以參考下
    2017-03-03
  • 詳解Struts2中配置默認(rèn)Action的方法

    詳解Struts2中配置默認(rèn)Action的方法

    本篇文章主要介紹了詳解Struts2中配置默認(rèn)Action的方法,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2018-01-01
  • SpringCloud Config使用配置方法

    SpringCloud Config使用配置方法

    這篇文章給大家介紹SpringCloud Config使用及構(gòu)建配置中心的方法,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧
    2021-07-07
  • Java 詳解循環(huán)屏障CyclicBarrier如何實(shí)現(xiàn)多線程分段等待執(zhí)行完成

    Java 詳解循環(huán)屏障CyclicBarrier如何實(shí)現(xiàn)多線程分段等待執(zhí)行完成

    CyclicBarrier是一個(gè)同步工具類,可以翻譯成循環(huán)屏障,也叫障礙器或同步屏障。CyclicBarrier內(nèi)部有一個(gè)計(jì)數(shù)器count,調(diào)用障礙器的await方法會(huì)使計(jì)數(shù)器count的值減一,當(dāng)計(jì)數(shù)器count的值為0時(shí),表明調(diào)用了await方法線程已經(jīng)達(dá)到了設(shè)置的數(shù)量
    2021-11-11
  • 深入理解Java8雙冒號(hào)::的使用

    深入理解Java8雙冒號(hào)::的使用

    這篇文章主要介紹了深入理解Java8雙冒號(hào)::的使用,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-09-09
  • Flink開發(fā)IDEA環(huán)境搭建與測(cè)試的方法

    Flink開發(fā)IDEA環(huán)境搭建與測(cè)試的方法

    這篇文章主要介紹了Flink開發(fā)IDEA環(huán)境搭建與測(cè)試的方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-03-03
  • 詳談@Autowired和static的關(guān)系

    詳談@Autowired和static的關(guān)系

    這篇文章主要介紹了@Autowired和static的關(guān)系,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-08-08
  • Java實(shí)現(xiàn)的簡(jiǎn)單數(shù)字處理類及用法示例

    Java實(shí)現(xiàn)的簡(jiǎn)單數(shù)字處理類及用法示例

    這篇文章主要介紹了Java實(shí)現(xiàn)的簡(jiǎn)單數(shù)字處理類及用法,涉及java數(shù)字運(yùn)算相關(guān)操作技巧,需要的朋友可以參考下
    2018-01-01
  • JAVA截取字符串的幾種常用方法

    JAVA截取字符串的幾種常用方法

    這篇文章主要給大家介紹了關(guān)于JAVA截取字符串的幾種常用方法, 在處理字符串的過程中有很多情況下會(huì)遇到需要截取字符串的情況,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2023-09-09
  • Java 選擇、冒泡排序、折半查找(實(shí)例講解)

    Java 選擇、冒泡排序、折半查找(實(shí)例講解)

    下面小編就為大家?guī)硪黄狫ava 選擇、冒泡排序、折半查找(實(shí)例講解)。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-08-08

最新評(píng)論

颍上县| 巴林左旗| 亳州市| 从江县| 鄄城县| 长垣县| 金乡县| 汕尾市| 读书| 克拉玛依市| 道孚县| 黄浦区| 五华县| 甘洛县| 巴中市| 和田市| 怀集县| 自治县| 和平县| 旌德县| 繁昌县| 郓城县| 奎屯市| 深州市| 格尔木市| 香河县| 治县。| 右玉县| 南投县| 绥德县| 界首市| 宣武区| 巴中市| 太谷县| 安义县| 盖州市| 灵台县| 台湾省| 汉中市| 洪雅县| 玛曲县|