Spring Cloud Feign 使用feign client时遇到的一个坑

使用feign 的时候遇到了一个坑,不知道有没有人也遇到。

问题描述:

定义好 feign client的interface以后 的java代码

@FeignClient(value = "test")
public interface TeacApiClient {

    @RequestMapping(method = RequestMethod.GET, value = "/{test}")
    public Object saveUpVersion(@Param("test") String test);
}


为了使用consul动态发现服务的url,所以需要自己构建Feign的client:

this.httpClient = Feign.builder().logLevel(Logger.Level.BASIC).target(TeacApiClient.class, url);

可是编译会出现如下错误:

Caused by: java.lang.IllegalStateException: Method saveUpVersion not annotated with HTTP method type (ex. GET, POST)
	at feign.Util.checkState(Util.java:128) ~[feign-core-9.5.0.jar:na]
	at feign.Contract$BaseContract.parseAndValidateMetadata(Contract.java:97) ~[feign-core-9.5.0.jar:na]
	at feign.Contract$BaseContract.parseAndValidatateMetadata(Contract.java:64) ~[feign-core-9.5.0.jar:na]
	at feign.ReflectiveFeign$ParseHandlersByName.apply(ReflectiveFeign.java:146) ~[feign-core-9.5.0.jar:na]
	at feign.ReflectiveFeign.newInstance(ReflectiveFeign.java:53) ~[feign-core-9.5.0.jar:na]
	at feign.Feign$Builder.target(Feign.java:218) ~[feign-core-9.5.0.jar:na]
	at feign.Feign$Builder.target(Feign.java:214) ~[feign-core-9.5.0.jar:na]
	at se.ericsson.bid.teso.saveupversion.services.TeacSaveUpVersionService.buildUpHttpClient(TeacSaveUpVersionService.java:49) ~[classes/:na]
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.8.0_131]
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:1.8.0_131]
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:1.8.0_131]
	at java.lang.reflect.Method.invoke(Method.java:498) ~[na:1.8.0_131]
	at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredMethodElement.inject(AutowiredAnnotationBeanPostProcessor.java:701) ~[spring-beans-4.3.13.RELEASE.jar:4.3.13.RELEASE]
	at org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:88) ~[spring-beans-4.3.13.RELEASE.jar:4.3.13.RELEASE]
	at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:366) ~[spring-beans-4.3.13.RELEASE.jar:4.3.13.RELEASE]
	... 30 common frames omitted


但是使用

    @RequestLine("POST /{test}")
    public Object saveUpVersion(@Param("test") String test);

编译就通过了。

可是总觉得这样写不太优雅。


解决方法:

官方文档也是用的@RequestMapping并没有这个问题, google了好久也没有好的解决方案,隐约感觉用该是feign使用的 mvn contract不太对,因为有人讨论 使用default feign contract 会出现同样的问题,所以代码改成:

this.httpClient = Feign.builder().logLevel(Logger.Level.BASIC).contract(new SpringMvcContract()).target(TeacApiClient.class, url);

就可以了。应该是默认使用的Contract.default并不支持spring 的requestmapping标签.


或者:

使用 FeignClientsConfiguration 中生成的contract

@Import(FeignClientsConfiguration.class)
public class xxx {
    @Autowired
    private void buildUpHttpClient(Contract contract) {
        this.httpClient = Feign.builder()
                .contract(contract)
                .target(TeacApiClient.class, getTeacUrl());
    }



评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

勇敢的炮灰

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值