17

我有一个工作的 Feign 接口定义为:

@FeignClient("content-link-service")
public interface ContentLinkServiceClient {

    @RequestMapping(method = RequestMethod.GET, value = "/{trackid}/links")
    List<Link> getLinksForTrack(@PathVariable("trackid") Long trackId);

}

如果我将其更改为使用 @RequestLine

@FeignClient("content-link-service")
public interface ContentLinkServiceClient {

    @RequestLine("GET /{trackid}/links")
    List<Link> getLinksForTrack(@Param("trackid") Long trackId);

}

我得到了例外

原因:java.lang.IllegalStateException:方法 getLinksForTrack 未使用 HTTP 方法类型注释(例如 GET、POST)

任何想法为什么?

4

3 回答 3

26

我不希望这会奏效。

@RequestLine是核心 Feign 注释,但您使用的是@FeignClient使用 Spring MVC 注释的 Spring Cloud。

于 2015-09-09T20:14:29.557 回答
19

Spring 创建了自己的 FeignContract以允许您使用 Spring 的@RequestMapping注释而不是 Feigns。您可以通过在应用程序上下文中包含一个 bean 类型feign.Contract.Default来禁用此行为。

如果你正在使用spring-boot(或任何使用 Java 配置的东西),在一个@Configuration类中包含这个应该重新启用 Feign 的注释:

@Bean
public Contract useFeignAnnotations() {
    return new Contract.Default();
}
于 2017-06-27T13:20:02.603 回答
-1

您的@RequestMapping值看起来不错,但您可能应该考虑稍微重写它:

 @GetMapping(value = "/{trackid}/links")
 List<Link> getLinksForTrack(@PathVariable(name = "trackid") Long trackId);

顺便说一句,由于与您相同的错误,我没有成功@RequestLine上班。

也为了@ReactiveFeignClients Contract.Default()产生以下错误:

java.lang.IllegalStateException: Method MyClient#doStuff(String,String) not annotated with HTTP method type (ex. GET, POST)
Warnings:
- Class MyClient has annotations [Component, ReactiveFeignClient, Metadata] that are not used by contract Default
- Method doStuff has an annotation GetMapping that is not used by contract Default

并且应该像这样固定:

var MyClient = WebReactiveFeign.builder()
        .contract(new ReactiveContract(new SpringMvcContract()))
        .target(MyClient, "http://example.com")
于 2020-10-24T19:21:45.103 回答