最近、人々はしばしばSpring Cloud Feignにファイルをアップロードする方法を尋ねます。チームの新しいメンバーと他の会社の兄弟がいます。この記事は簡単に要約します -
In early Spring Cloud, Feign itself did not have the ability to upload files (1 year ago). To achieve this, you need to write Encoder by yourself to implement upload. Now we are much happier. Feignの役人は、アップロードに必要なエンコーダーを実装するサブプロジェクトFeignFormを提供しているためです。
注:私がテストしたバージョンはEdgware.releaseです。カムデンとダルストンは、この記事の説明にも適応しています。
依存関係を追加します
<Dependency> <groupId> io.github.openfeign.form </groupid> <artifactid> feign-form </artifactid> <bersion> 3.0.3 </version> </dependency> <redency> <groupid> io.github.openfeign.form </groupid> <artifactid> <バージョン> 3.0.3 </version> </dependency>
feign clientを書く
@feignclient(name = "ms-content-sample"、configuration = uploadfeignclient.multipartsupportconfig.class)public interface uploadfeignclient {@requestmapping(bale = "/upload"、method = requestmethod.post、ducess = {mediatype.application_json_json_utf8_value} MediaType.MULTIPART_FORM_DATA_VALUE) @ResponseBody String handleFileUpload(@RequestPart(value = "file") MultipartFile file); class multipartsupportconfig {@bean public encoder feignformencoder(){return new SpringFormencoder(); }}}コードが示すように、このPeignクライアントでは、Configuration Class MultiPartSupportConfigを参照し、MultiPartSupportConfigでSpringFormencoderをインスタンス化します。このようにして、Feignクライアントをアップロードできます。
注記
@RequestMapping(value = "/upload"、method = requestmethod.post、produces = {mediatype.application_json_utf8_value}、consumer = mediatype.multipart_form_data_value)は欠落してはなりません。接口定义中的注解@RequestPart(value = "file") 不能写成@RequestParam(value = "file" 。
Hystrixのタイムアウトを5秒など、もう少し長く設定することをお勧めします。そうしないと、Hystrixがファイルがアップロードされる前にタイムアウトし、クライアント側にエラーが発生する可能性があります。
SpringCloudでのfeignを使用する落とし穴
例は次のとおりです。
@feignclient( "service-resource")//@requestmapping( "/api/test")public interface testresourceitg {@requestmapping(value = "/api/test/raw"、methodmethod.post、Consumers = "Application/x-www-form-urlencoded")Public String ring1(@pathvariable ") @RequestParam( "content")文字列コンテンツ); // コンテンツ}説明:
*リクエストマッピングで消費を使用して、生成されたリクエストのコンテンツタイプを指定する
*requestparamによって指定されたパラメーターは、以下など、URLの後にスプライスされます。名前= xxx&age = 18
*PathVariableパラメーターは、LinkedHashmap <String、?>に送信され、処理のためにFeign Encoderに送信されます。春にこのインターフェイスを実装するエンコーダーはSpringEncoderであり、この実装は春のhttpmessageconverterを使用してリクエスト本体を書きます。
ピット:
*インターフェイスクラス名でrequestMappingを使用しないでください。使用できますが、SpringMVCはコントローラーとしてインターフェイスのインスタンスを開きます。 This can be viewed in the startup Mapping log.
*消費が指定されていない場合、PathVariableのパラメーターはJSON文字列を生成して送信し、フォーム生成法はデフォルトではサポートされていません。 The reason is that FormHttpMessageConverter can only handle MultiValueMap, while the use of PathVariable parameters is placed in HashMap. File upload is not supported by default. In fact, there is already an HttpMessageConverter that supports handling various situations.
填坑:
*フォームのサポートフォームの提出:MAPをサポートするFormHTTPMessageConverterを作成するだけです。操作を簡素化するために、formhttpmessageconverterの方法を内部的に呼び出すことができます。
*サポートファイルのアップロード:リソースにアップロードするファイルをカプセル化するだけです(リソースは、リクエストパラメーターをファイルに解析する識別子であるFilenameインターフェイスを実装する必要があります)。
*MultiPartFileパラメーターを処理するためのサポート:MultiPartFilehttpmessageConverterをMultiPartFileをサポートするだけです。 ResourceHttpmessageConverterの実装を内部的に呼び出すことができます。同時に、formhttpmessageconverterの部分に追加する必要があることに注意してください。MultiPartFileからのファイル名の取得をサポートするには、formhttpmessageconverterのgetFileNameメソッドを書き直します。
*すべてのhttpmessageconverterは@Beanモードで直接生成でき、Springは自動的に認識して追加します
フォームとファイルのアップロードに対する完璧なサポート:
方案一:
添付ファイルでmapformhttpmessageconverter.javaおよびmultipartfilehttpmessageconverter.javaを使用します
春に次の構成を作成します
@beanpublic mapformhttpmessageconverter mapformhttpmessageconverter(multipartfilehttpmessageconverter multipartfilehttpmessageconverter){mapformhttpmessageconverter mapformhttpmessageconttpmessagenter = new mapformhttpmessagonter(); mapformhttpmessageconverter.addpartconverter(multipartfilehttpmessageconverter); mapformhttpmessageconverter;}@beanpublic multipartfilehttpmessageconverter multipartfilehttpmessageconverter(){return new multipartfilehttpmessageconverter();}プラン2:
feignspringformencoder.javaを使用します
春には、次のように構成します。
@BeanPublic Encoder FeignenCoder(ObjectFactory <HTTPMessageConverters> MessageConverter){新しいFeignSpringFormencoder(MessageConverters);}推奨される使用計画1
プラン2は、参照https://github.com/pcan/feign-client-test、テストされていません
上記はこの記事のすべての内容です。みんなの学習に役立つことを願っています。誰もがwulin.comをもっとサポートすることを願っています。