весенняя загрузка имитирует клиент, получающий HTTP 404

В настоящее время я просто проверяю, как использовать Feign в качестве декларативного клиента REST в одном из моих проектов.

ниже Feign Client

@FeignClient(name = "SEARCHCABMS",configuration = AppFeignConfiguration.class)
       public interface SearchCabMsClient {

        @RequestMapping(value = "api/searchcab/locationcabtimedetail/search/getCabForLocationAfterTimeSlot", method = RequestMethod.GET)
        String  searchCabDetails(@PathVariable("fromDate") String fromDate, 
                                @PathVariable("locationId") long locationId,
                                @PathVariable("isdeleted") byte isdeleted,
                                @PathVariable("hourforbooking")int hourforbooking);
    }

Этот интерфейс автоматически запрограммирован в одном сервисе.

@Autowired
SearchCabMsClient restService;

Добавлен EnableFeignClients в SpringBootApplication

@EnableFeignClients(basePackages = {"com.gp.cabbooking.services.feign"})

Зависимости, родительский элемент и т. Д. В pom.xml

<parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>1.3.5.RELEASE</version>
</parent>

зависимость

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-eureka</artifactId>
</dependency>

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-ribbon</artifactId>
</dependency>

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-feign</artifactId>
</dependency>

Во время отладки я могу видеть, как создать прокси-сервер для моего воображаемого клиента, я пытался вызвать эту службу с помощью ленты, и она работает нормально, но когда я выполняю определение метода в моем воображаемом клиенте. я получаю feign.FeignException: статус 404: чтение

feign.FeignException: status 404 reading SearchCabMsClient#searchCabDetails(String,long,byte,int)
    at feign.FeignException.errorStatus(FeignException.java:62) ~[feign-core-8.16.2.jar:8.16.2]
    at feign.codec.ErrorDecoder$Default.decode(ErrorDecoder.java:91) ~[feign-core-8.16.2.jar:8.16.2]
    at feign.SynchronousMethodHandler.executeAndDecode(SynchronousMethodHandler.java:134) ~[feign-core-8.16.2.jar:8.16.2]
    at feign.SynchronousMethodHandler.invoke(SynchronousMethodHandler.java:76) ~[feign-core-8.16.2.jar:8.16.2]
    at feign.hystrix.HystrixInvocationHandler$1.run(HystrixInvocationHandler.java:97) ~[feign-hystrix-8.16.2.jar:8.16.2]
    at com.netflix.hystrix.HystrixCommand$1.call(HystrixCommand.java:293) ~[hystrix-core-1.5.3.jar:1.5.3]
    at com.netflix.hystrix.HystrixCommand$1.call(HystrixCommand.java:289) ~[hystrix-core-1.5.3.jar:1.5.3]
    at rx.internal.operators.OnSubscribeDefer.call(OnSubscribeDefer.java:46) ~[rxjava-1.1.5.jar:1.1.5]
    at rx.internal.operators.OnSubscribeDefer.call(OnSubscribeDefer.java:35) ~[rxjava-1.1.5.jar:1.1.5]
    at rx.internal.operators.OnSubscribeLift.call(OnSubscribeLift.java:50) ~[rxjava-1.1.5.jar:1.1.5]
    at rx.internal.operators.OnSubscribeLift.call(OnSubscribeLift.java:30) ~[rxjava-1.1.5.jar:1.1.5]
    at rx.internal.operators.OnSubscribeLift.call(OnSubscribeLift.java:50) ~[rxjava-1.1.5.jar:1.1.5]
    at rx.internal.operators.OnSubscribeLift.call(OnSubscribeLift.java:30) ~[rxjava-1.1.5.jar:1.1.5]
    at rx.Observable.unsafeSubscribe(Observable.java:8460) ~[rxjava-1.1.5.jar:1.1.5]
    at rx.internal.operators.OnSubscribeDefer.call(OnSubscribeDefer.java:51) ~[rxjava-1.1.5.jar:1.1.5]
    at rx.internal.operators.OnSubscribeDefer.call(OnSubscribeDefer.java:35) ~[rxjava-1.1.5.jar:1.1.5]
    at rx.internal.operators.OnSubscribeLift.call(OnSubscribeLift.java:50) ~[rxjava-1.1.5.jar:1.1.5]

person Ganesh Pol    schedule 12.08.2016    source источник


Ответы (5)


Вам необходимо создать feign.ErrorDecoder. Пожалуйста, прочтите это для получения дополнительной информации https://github.com/spring-cloud/spring-cloud-openfeign/issues/118

Вы также можете добавить decode404=true в определение аннотации FeignClient.

person The_Cute_Hedgehog    schedule 08.04.2019
comment
Этот ответ заслуживает того, чтобы его приняли. В случае Feign.builder() просто добавьте .decode404. - person dgregory; 23.09.2019

Вы определили URL-адрес службы, к которой вы обращаетесь с помощью этого фиктивного клиента? 404 - проблема не обнаружена.

  @FeignClient(name = "SEARCHCABMS", url = "${SEARCHCABMS.service.url}", 
  configuration = ClientConfiguration.class)
  public interface SearchCabMsClient {

  }

Наличие держателя ссылки в URL-адресе помогает сделать его внешним и настроить для каждой среды.

Если вы настроили URL-адрес, дважды проверьте остальную конечную точку.

person Seetharamani Tmr    schedule 07.04.2017
comment
Spring Cloud Feign должен вызываться на основе имени приложения без использования URL-адреса, верно? - person Abdul; 24.07.2019
comment
Я не понимаю, что вы имеете в виду? Что касается этого ответа, симулировать клиента либо из openfeign, либо из весеннего облака, не имеет значения. Это просто реализация http-клиента. Поэтому вам нужно указать URL-адрес, к которому он должен подключиться. - person Seetharamani Tmr; 03.08.2019

В большинстве ответов предлагается поместить атрибут url в @FeignClient, но когда архитектура включает регистрацию службы (Eureka Client) на Eureka Server, я думаю, что свободы нет. использовать атрибут url.

Это service-id или eureka-id, который должен использоваться для целей отдыха .
Итак, с client-side discovery architecture,

@FeignClient(name = "service-id", url = "${service.url}", configuration=SomeConfig.class)

больше не может быть масштабируемым решением проблемы
status 404 reading IFeignClient#someControllerMethod().

Я столкнулся с той же ошибкой в ​​своем приложении client-side discovery architecture. Проблема заключалась в этой записи в файле application.yml:

server:
  servlet:
    context-path: /myapp

Его удаление помогло решить проблему путем правильного url. Точное объявление, которое есть в моем рабочем приложении: @FeignClient(name="${service-id}")

Надеюсь, это поможет кому-то с аналогичной проблемой.

person javac    schedule 28.12.2019
comment
Вместо удаления context-path из application.yml вы могли бы добавить / myapp в качестве префиксного пути к декларативному методу клиента Feign, например @RequestMapping (value = / myapp / Остающийся путь, method = RequestMethod.GET) String feignMethod (.. .); - person abhinav kumar; 31.05.2021

У меня такая же проблема. Это проблема маршрутизации. Просто добавьте / в начале пути @RequestMapping в FeignClient. Кроме того, в пути не определены переменные пути. Я рекомендую определять их как @RequestParam. Тогда путь правильный, кроме / в начале.

@FeignClient(name = "SEARCHCABMS",configuration = AppFeignConfiguration.class)
   public interface SearchCabMsClient {

    @RequestMapping(value = "/api/searchcab/locationcabtimedetail/search/getCabForLocationAfterTimeSlot/{fromDate}/{locationId}/{isdeleted}/{hourforbooking}", method = RequestMethod.GET)
    String  searchCabDetails(@PathVariable("fromDate") String fromDate, 
                            @PathVariable("locationId") long locationId,
                            @PathVariable("isdeleted") byte isdeleted,
                            @PathVariable("hourforbooking")int hourforbooking);
}
person Valeriy K.    schedule 12.07.2019

Если вы установили server.servlet.context-path: ## some name ##, удалите его и установите имя приложения, отображаемое на домашней странице сервера EUREKA.

person kupendra pola    schedule 23.07.2020