热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

填坑系列之OpenFeign

前提在fallback时,发现重复注册了两次同一uri,报错:Invocationofinitmethodfailed;nestedexceptionisjava.lang.Ill

前提

在fallback时,发现重复注册了两次同一uri,报错:

Invocation of init method failed; nested exception is java.lang.IllegalStateException: Ambiguous mapping. Cannot map 'com.yiming.user_consumer.service.UserConsumerService' method com.yiming.user_consumer.service.UserConsumerService#isAlive() to {GET /user/isAlive}: There is already 'userProviderBack' bean method com.yiming.user_consumer.componant.UserProviderBack#isAlive() mapped.

原因

这是Feign的一个Bug。在api中添加了@RequestMapping(“/xxx”)注解后,SpringMVC、Hystrix、Feign都要检查uri。如果单是Feign,那么加@RequestMapping没问题,但是如果再配上Hystrix,就会重复注册两次url。


解决方法

方法1:去掉@RequestMapping(“/xxx”)

方法2:在每个方法前手写uri(如果不嫌麻烦的话…),或者定义一个常量去拼接,例如:@GetMapping("/xxx/xxx")


实例

以下有三个服务,分别为user-apiuser-provider:user-consumer,在调用user-provider服务时,发生异常(请求超时等)就会调用user-consumer中的UserProviderBack类中相应的方法。

user-api:

//@RequestMapping("/user")
public interface RegisterApi {
@GetMapping("/isAlive")
String isAlive();
}

或者

public interface RegisterApi {
@GetMapping("/user/isAlive")
String isAlive();
}

user-provider:

@RestController
public class UserController implements RegisterApi {
@Override
public String isAlive() {
return "OK";
}
}

user-consumer:

@FeignClient(name = "user-provider", fallback = UserProviderBack.class)
public interface UserConsumerService extends RegisterApi {
@GetMapping("/isAlive")
String isAlive();
}

@Component
public class UserProviderBack implements UserConsumerService {
@Override
public String isAlive() {
return "降级了";
}
}


推荐阅读
author-avatar
一个人失忆9988_347_289
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有