3

サーバー側 API の多くのマッピングを持つ既存の Spring Cloud Feign クライアント インターフェイスがあります。いくつかの新しいメソッドを追加していますが、突然エラーが発生しました。次の形式のメソッドを追加しようとしています:

@RequestMapping(value = "/tasks/{id}", method = GET)
public Resource<Task> getTask(@PathVariable("id")Long id);

すべて正常にコンパイルされますが、上記の getTask() メソッドを呼び出そうとすると、URL が無効であるという不平を言う IllegalArgumentException が常に発生します。URL にはまだ UriTemplate が含まれているため、これは正しいこと{id}です。

完全なスタックは次のとおりです。

java.lang.IllegalArgumentException: Illegal character in path at index 29: http://connect/connect/tasks/{id}
    at java.net.URI$Parser.fail(URI.java:2848)
    at java.net.URI$Parser.checkChars(URI.java:3021)
    at java.net.URI$Parser.parseHierarchical(URI.java:3105)
    at java.net.URI$Parser.parse(URI.java:3053)
    at java.net.URI.<init>(URI.java:588)
    at java.net.URI.create(URI.java:850)
    at feign.ribbon.RibbonClient.execute(RibbonClient.java:64)
    at feign.SynchronousMethodHandler.executeAndDecode(SynchronousMethodHandler.java:92)
    at feign.SynchronousMethodHandler.invoke(SynchronousMethodHandler.java:71)
    at feign.ReflectiveFeign$FeignInvocationHandler.invoke(ReflectiveFeign.java:94)
    at com.sun.proxy.$Proxy55.getTask(Unknown Source)

このまったく同じパターンを使用する同じインターフェイスには、他にも多数のメソッドがあり、すべて正常に動作します。Feign/Springがこの方法で突然問題を抱えている理由を、私の人生では理解できません。メソッドを作成するための設定と方法の可能な限りの組み合わせを試しました。単純に を削除する{id}と、呼び出しは実行されますが、URI の id 部分が欠落しているため、明らかに間違ったデータが返されます。

Spring Cloud Angel.SR6 を Spring Boot 1.2.8 および Feign 8.5.0 で使用しています。

4

1 に答える 1

6

問題を解決します。エラーメッセージはかなり誤解を招くものでした。メソッドが Null 値で渡されていたことが判明したため、URI テンプレートで置き換えるものは何もありませんでした。インターフェイスであるため、少なくとも今知っている限り、Not Null 要件をアサートするロジックを追加することはできません。

それを理解して呼び出しの上流で解決すると、IllegalArgumentException は解消されました。入力が NULL であったという事実は、元のメモのスタック トレースに記載されていないことに注意してください。

于 2016-03-14T15:31:53.040 に答える