Все REST API не загружаются, если класс и интерфейс контроллера REST имеют API с аннотацией @HystrixCommand

#java #spring-boot #spring-cloud #hystrix

#java #весенняя загрузка #spring-cloud #hystrix

Вопрос:

Я начал использовать spring boot 1.4.1 и spring cloud Camden.ОТПУСТИТЕ.

Я создал два простых класса контроллеров REST вместе с их интерфейсами. Я разместил аннотацию @HystrixCommand для одного API первого класса контроллера и интерфейса. Я также добавил метод резервного копирования в тот же класс контроллера и интерфейс. Компиляция кода проходит нормально, и служба тоже загружается нормально. Но я вижу, что API-интерфейсы REST первого класса контроллера REST не загружены / не сопоставлены, что означает, что вызов этих API-интерфейсов REST возвращает 404. У меня был 2-й контроллер REST без какой-либо @HystrixCommand, и API, принадлежащий этому классу, загружается нормально.

Если я просто закомментирую ‘implements <имя интерфейса >’ в первом классе контроллера REST, все начнет работать.

Каково решение?

Некоторый фиктивный фрагмент кода, помогающий понять проблему —

 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() { ... }
}
  

Комментарии:

1. Почему вы аннотируете методы в интерфейсах? Не забудьте аннотировать классы с @RestController помощью .

Ответ №1:

Это известная проблема. @HystrixCommand Включение контроллеров с резервным вариантом не работает. Переместите работу в другой компонент с аннотацией hystrix.