Caused by: feign.FeignException: status 404 reading XXXFeign#findSpuById(String)报错解决

    科技2022-07-31  93

    今天在做项目的时候,当我调用feign暴露的远程声明方法时,调用总是出问题,

    我这里是商品在审核通过之后,通过canal的数据监控,发送mq消息到生成静态页面的微服务,生成静态页面微服务的mq监听,监听到mq的消息,然后调用feign远程服务的方法获取数据赋值到Thymeleaf模板上的时候,远程调用发生的bug,404的bug,报错如下。

    org.springframework.amqp.rabbit.listener.exception.ListenerExecutionFailedException: Listener method 'public void com.changgou.page.listener.PageListener.receiveMessage(java.lang.String)' threw exception at org.springframework.amqp.rabbit.listener.adapter.MessagingMessageListenerAdapter.invokeHandler(MessagingMessageListenerAdapter.java:198) ~[spring-rabbit-2.1.5.RELEASE.jar:2.1.5.RELEASE] at org.springframework.amqp.rabbit.listener.adapter.MessagingMessageListenerAdapter.onMessage(MessagingMessageListenerAdapter.java:127) ~[spring-rabbit-2.1.5.RELEASE.jar:2.1.5.RELEASE] at org.springframework.amqp.rabbit.listener.AbstractMessageListenerContainer.doInvokeListener(AbstractMessageListenerContainer.java:1552) ~[spring-rabbit-2.1.5.RELEASE.jar:2.1.5.RELEASE] at org.springframework.amqp.rabbit.listener.AbstractMessageListenerContainer.actualInvokeListener(AbstractMessageListenerContainer.java:1478) ~[spring-rabbit-2.1.5.RELEASE.jar:2.1.5.RELEASE] at org.springframework.amqp.rabbit.listener.AbstractMessageListenerContainer.invokeListener(AbstractMessageListenerContainer.java:1466) ~[spring-rabbit-2.1.5.RELEASE.jar:2.1.5.RELEASE] at org.springframework.amqp.rabbit.listener.AbstractMessageListenerContainer.doExecuteListener(AbstractMessageListenerContainer.java:1461) ~[spring-rabbit-2.1.5.RELEASE.jar:2.1.5.RELEASE] at org.springframework.amqp.rabbit.listener.AbstractMessageListenerContainer.executeListener(AbstractMessageListenerContainer.java:1410) ~[spring-rabbit-2.1.5.RELEASE.jar:2.1.5.RELEASE] at org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer.doReceiveAndExecute(SimpleMessageListenerContainer.java:870) [spring-rabbit-2.1.5.RELEASE.jar:2.1.5.RELEASE] at org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer.receiveAndExecute(SimpleMessageListenerContainer.java:854) [spring-rabbit-2.1.5.RELEASE.jar:2.1.5.RELEASE] at org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer.access$1600(SimpleMessageListenerContainer.java:78) [spring-rabbit-2.1.5.RELEASE.jar:2.1.5.RELEASE] at org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer$AsyncMessageProcessingConsumer.mainLoop(SimpleMessageListenerContainer.java:1137) [spring-rabbit-2.1.5.RELEASE.jar:2.1.5.RELEASE] at org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer$AsyncMessageProcessingConsumer.run(SimpleMessageListenerContainer.java:1043) [spring-rabbit-2.1.5.RELEASE.jar:2.1.5.RELEASE] at java.lang.Thread.run(Thread.java:748) [na:1.8.0_231] Caused by: feign.FeignException: status 404 reading SpuFeign#findById(String) at feign.FeignException.errorStatus(FeignException.java:78) ~[feign-core-10.1.0.jar:na] at feign.codec.ErrorDecoder$Default.decode(ErrorDecoder.java:93) ~[feign-core-10.1.0.jar:na] at feign.SynchronousMethodHandler.executeAndDecode(SynchronousMethodHandler.java:149) ~[feign-core-10.1.0.jar:na] at feign.SynchronousMethodHandler.invoke(SynchronousMethodHandler.java:78) ~[feign-core-10.1.0.jar:na] at feign.ReflectiveFeign$FeignInvocationHandler.invoke(ReflectiveFeign.java:103) ~[feign-core-10.1.0.jar:na] at com.sun.proxy.$Proxy91.findById(Unknown Source) ~[na:na] at com.changgou.page.service.impl.PageServiceImpl.getItemData(PageServiceImpl.java:104) ~[classes/:na] at com.changgou.page.service.impl.PageServiceImpl.generateHtml(PageServiceImpl.java:49) ~[classes/:na] at com.changgou.page.listener.PageListener.receiveMessage(PageListener.java:21) ~[classes/:na] at sun.reflect.GeneratedMethodAccessor74.invoke(Unknown Source) ~[na:na] at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:1.8.0_231] at java.lang.reflect.Method.invoke(Method.java:498) ~[na:1.8.0_231] at org.springframework.messaging.handler.invocation.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:170) ~[spring-messaging-5.1.6.RELEASE.jar:5.1.6.RELEASE] at org.springframework.messaging.handler.invocation.InvocableHandlerMethod.invoke(InvocableHandlerMethod.java:120) ~[spring-messaging-5.1.6.RELEASE.jar:5.1.6.RELEASE] at org.springframework.amqp.rabbit.listener.adapter.HandlerAdapter.invoke(HandlerAdapter.java:49) ~[spring-rabbit-2.1.5.RELEASE.jar:2.1.5.RELEASE] at org.springframework.amqp.rabbit.listener.adapter.MessagingMessageListenerAdapter.invokeHandler(MessagingMessageListenerAdapter.java:190) ~[spring-rabbit-2.1.5.RELEASE.jar:2.1.5.RELEASE] ... 12 common frames omitted

    报的错误是 feign  404 

    404 身为开发人员都懂,是找不到这个服务页面,或者方法,

    然后在网上各种找资料,查询前辈出现的同样的问题,有的说是restful风格的开发,@Controller应该写成@RestController,

    或者是没写@RequestMapping等。

     

    我反复排查了自己的配置文件和pojo、feign以及注解声明等,最后发现自己的问题是,在feign中我声明的方法,在对应的控制器中并没有这个方法,

    feign中声明式方法

     然而在我控制器中的方法声明是这样的

     最后修改成一致,

    测试:

     ok:

    总结:

    首先在启动类要开启@EnableFiegnClients注解 属性 baspackges执行feign的包路径在feign服务器提供方需要开启@FeignClient注解,声明自己是个feign远程服务提供方要保证声明式方法中的请求注解在对应的Controller注解中要有对应的方法,否则也会404报错

     希望对大家有所帮助。

    Processed: 0.009, SQL: 8