2017-06-01 5 views
3

に空だった私はこのような春ブーツとシンプルな装うクライアントを作成しました:Fiegnの春ブーツとクライアント:RequestParam.value()は、パラメータ0

@FeignClient("spring-cloud-eureka-client") 
public interface GreetingClient { 
@RequestMapping("/greeting") 
    String greeting(@RequestParam String name); 
} 

しかし、私は私が得るアプリケーションを起動するだけでしようとすると、エラー:

最初に私は何が理由であるのかわからず、たくさんのグーグルが答えを見つけられませんでした。ほとんどexcidentely私はそれが明示的に要求のparamの名前を書くことがあれば動作することを考え出した:

@RequestParam("name") String name 

だから私の質問:それはバグですか、それはリクエストパラメータ名を明示的に記述しないように設定されるだろうか?

+1

私は、パラメータ名をjava 8で使用できるようにjvm設定が必要であると信じています。 – spencergibb

+0

@spencergibbプレーンなSpring Restコントローラ用の同じjvmで追加設定なしで動作します。 – Igorock

答えて

2

Spring MVCとSpringクラウドの両方が同じParameterNameDiscovererを使用しています - DefaultParameterNameDiscovererという名前でパラメータ名を検索します。次の手順でパラメータ名を探します。

まず、StandardReflectionParameterNameDiscovererを使用します。それは、リフレクションで変数名を見つけることを試みます。クラスが-parameterでコンパイルされている場合にのみ可能です。

第2に、失敗した場合はLocalVariableTableParameterNameDiscovererを使用します。 ASMライブラリを使用してクラスファイル内のデバッグ情報から変数名を検索しようとします。

ここでは、Spring MVCとFeignの違いがあります。 Feignは、上記のアノテーション(@RequestParamなど)をJavaインタフェースのメソッドに使用します。しかし、Spring MVCを使用するときは、これらをJavaクラスのメソッドに使用します。残念ながら、javacコンパイラは、クラスファイルのパラメータ名のデバッグ情報をjava interfacesのために省略しています。だから、feignは-parameterなしでパラメータ名を見つけることができません。

つまり、コードを-parameterでコンパイルすると、Spring MVCとFeignの両方がパラメータ名の取得に成功します。しかし、-parameterなしでコンパイルすると、Spring MVCだけが成功します。

その結果、バグではありません。これは私が思うように今のところFeignの限界です。