spring cloud Feign使用中に発生した問題を詳しく説明してまとめます。
本論文では、spring cloud Feign使用中に発生した問題のまとめを紹介します。
問題1:
前の例では、私達は言ったことがあります。
問題二:
前の例では、私達がレストfulサービスを見逃す方法は以下の通りです。
問題三:マルチパラメータ問題
Caused by:java.lang.Illege StarteException:Method has too many Body parameters:public abstract comput.chliu.springboot.rets.vo.User comput.spring.spright.sprigboot.rect
異常原因:Feignを使用すると、get要求が送信される場合、要求パラメータの前に@Request Param注解修飾を加える必要があり、Controllerの中にこの注釈修飾を加えなくても良い。
上記の問題の解決策は以下の通りです。
エラーコードの例:
以上が本文の全部です。皆さんの勉強に役に立つように、私たちを応援してください。
問題1:
前の例では、私達は言ったことがあります。
@RequestMapping(value = "/user/{id}", method = RequestMethod.GET)
@GetMapping("/user/{id}")
この二つの注釈の効果は等価ですが、Feignでは上記のような方式しか使えません。直接@GetMappingを使うことができません。以下のように、前の例を@GetMappingに変えて効果を見てみます。注解を修正してサービスを再起動する時、下記のような異常を投げました。
Caused by: java.lang.IllegalStateException: Method findById not annotated with HTTP method type (ex. GET, POST)
異常という意味は、HTTPを指定する方法がないということです。問題二:
前の例では、私達がレストfulサービスを見逃す方法は以下の通りです。
@GetMapping("/template/{id}")
public User findById(@PathVariable Long id) {
return client.findById(id);
}
ここでは、findById法のパラメータの中で、直接使用しました。
@PathVariable Long id
Feignの方式も以下のように変更します。
@RequestMapping(value = "/user/{id}", method = RequestMethod.GET)
User findById(@PathVariable Long id);
そしてサービスを開始して、私達はまた異常を投げました。異常情報は以下の通りです。
Caused by: java.lang.IllegalStateException: PathVariable annotation was empty on param 0.
大体の意味はPathVarable注解の最初のパラメータは空にできないということです。
@RequestMapping(value = "/user/{id}", method = RequestMethod.GET)
User findById(@PathVariable("id") Long id);
再起動したら、すべてOKです。問題三:マルチパラメータ問題
@RequestMapping(value="/user/name", method=RequestMethod.GET)
User findByUsername(final String userName, final String address);
サービスを開始する時、下記の異常を報告します。Caused by:java.lang.Illege StarteException:Method has too many Body parameters:public abstract comput.chliu.springboot.rets.vo.User comput.spring.spright.sprigboot.rect
異常原因:Feignを使用すると、get要求が送信される場合、要求パラメータの前に@Request Param注解修飾を加える必要があり、Controllerの中にこの注釈修飾を加えなくても良い。
上記の問題の解決策は以下の通りです。
@RequestMapping(value="/user/name", method=RequestMethod.GET)
User findByUsername(@RequestParam("userName") final String userName, @RequestParam("address") final String address);
問題4:Request method'POST'not supportedエラーコードの例:
@RequestMapping(value="/user/name", method=RequestMethod.GET)
User findByUsername(final String userName, @RequestParam("address") final String address);
注意:上のuserNameパラメータは@Request Paramでコメントしていません。要求を送信すると、呼び出されたサービスはRequest method'POST'not supportedに報告されています。私たちはGET方法を使っていますが、なぜサービスを呼び出されたのか?自動的にrequest bodyとして処理されます。bodyがある限り、feignはpostリクエストと見なされますので、全体のサービスはrequest parameterとbodyを伴うpostとして送信されます。以上が本文の全部です。皆さんの勉強に役に立つように、私たちを応援してください。