如果 REST 控制器类和接口具有使用 @HystrixCommand 注释的 API,则不会加载所有 REST API

Posted

技术标签:

【中文标题】如果 REST 控制器类和接口具有使用 @HystrixCommand 注释的 API,则不会加载所有 REST API【英文标题】:All REST APIs are not loaded if the REST controller class and interface have an API annotated with @HystrixCommand 【发布时间】:2017-02-08 01:24:11 【问题描述】:

我已经开始使用 spring boot 1.4.1 和 spring cloud Camden.RELEASE。

我创建了两个简单的 REST 控制器类及其接口。我已经在第一个控制器类的一个 API 上放置了 @HystrixCommand 注释,并且两者都接口。我还在同一个控制器类和接口中添加了回退方法。代码编译顺利,服务加载也很好。但我看到第一个 REST 控制器类 REST API 未加载/映射,这意味着调用这些 REST API 返回 404。我有一个没有任何 @HystrixCommand 的第二个 REST 控制器,属于此类的 API 加载正常。

如果我在第一个 REST 控制器类中简单地注释掉“实现”,一切都会开始工作。

有什么办法?

一些虚拟代码 sn-p 以帮助理解问题 -

public interface FirstRESTController 

   @RequestMapping(value = "/aa", method = RequestMethod.GET)
   ResponseEntity<String> getAA();

   @HystrixCommand(fallbackMethod = "reliable")
   @RequestMapping(value = "/bb", method = RequestMethod.GET)
   ResponseEntity<String> getBB();

   public ResponseEntity<String> reliable();


@RestController
class FirstRESTControllerImpl implements FirstRESTController 

    @RequestMapping(value = "/aa", method = RequestMethod.GET)
    ResponseEntity<String> getAA()  ... 

    @HystrixCommand(fallbackMethod = "reliable")
    @RequestMapping(value = "/bb", method = RequestMethod.GET)
    ResponseEntity<String> getBB()  ... 

    public ResponseEntity<String> reliable()  ... 


---------------------------------------------------------------------
public interface SecondRESTController 

    @RequestMapping(value = "/cc", method = RequestMethod.GET)
    ResponseEntity<String> getCC();


@RestController
class SecondRESTControllerImpl implements SecondRESTController 

    @RequestMapping(value = "/cc", method = RequestMethod.GET)
    ResponseEntity<String> getCC()  ... 

【问题讨论】:

为什么要对接口中的方法进行注解?不要忘记用@RestController注释类。 【参考方案1】:

这是一个已知问题。在具有后备功能的控制器上使用 @HystrixCommand 是行不通的。使用 hystrix 注释将工作转移到另一个 bean。

【讨论】:

以上是关于如果 REST 控制器类和接口具有使用 @HystrixCommand 注释的 API,则不会加载所有 REST API的主要内容,如果未能解决你的问题,请参考以下文章

如何使用具有相同控制器的 Laravel 制作网站和 API REST?

具有类和接口的 Java 泛型 - 一起使用

Salesforce REST 接口集成服务

使用 OData 接口开发 Spring REST 服务

抽象类和接口

抽象类和接口的简要概述