Согласно тегам, вы используете Spring Boot, очевидно, с Spring Cloud OpenFeign. И дело в том, что вы смешиваете два разных контракта Feign.
Аннотации типа @RequestLine
и @Headers
взяты из core feign library . Вы можете использовать его как декларативный HTTP-клиент, и не только в приложениях Spring (в этом случае не нужно использовать аннотации Spring).
Таким образом, правильный «пример 2» с простым Feign может быть например:
@Headers("Content-Type: application/json")
@RequestLine("GET api/v2/clients/{uid}?limit={limit}&offset={offset}")
ClientResponse findAllClientsByUid(@Param("uid") String uid,
@Param("limit") Integer limit,
@Param("offset") Integer offset);
С другой стороны, такие вещи, как @RequestParam
и @PathVariable
, принадлежат Spring Web. Их можно использовать, если у вас есть библиотека Spring Cloud OpenFeign (кстати, основной компонент - один из ее компонентов). Эта библиотека поддерживает SpringMvcContract , что в ее случае позволяет использовать обычные аннотации Spring Web для определения сопоставления запросов вместо спецификаций Feign * c.
В случае SpringMvcContract
, «пример 2» может выглядеть следующим образом:
@GetMapping(value = "api/v2/clients/{uid}", consumes = MediaType.APPLICATION_JSON_VALUE)
ClientResponse findAllClientsByUid(@PathVariable(value = "uid") String uid,
@RequestParam(value = "limit", required = false) Integer limit,
@RequestParam(value = "offset", required = false) Integer offset);
Стоит отметить, что в Spring Cloud OpenFeign по умолчанию используется второй подход . Чтобы вернуть его в обычный контракт Feign, определите пользовательский компонент Contract
( source ):
@Bean
public Contract feignContract() {
return new feign.Contract.Default();
}