Spring cloud openfeign status 404

问题描述 投票:0回答:1

我正在研究一个杂项服务示例,我有4种微服务:-尤里卡服务器(发现)-网关服务(zuul代理)-资源服务(假客户)-用户服务(用户分类示例)

一切正常;即使当我通过代理调用用户服务api时,它也可以完美地工作;但是我的目标是使用假客户端调用用户服务api,这时我得到了错误

feign.FeignException $ NotFound:状态404读取UserDetailsS​​erviceFeign#getUserById(Long)

Stacktrace:

feign.FeignException $ NotFound:状态404读取UserDetailsS​​erviceFeign#getUserById(Long)在feign.FeignException.clientErrorStatus(FeignException.java:165)〜[feign-core-10.4.0.jar:na]在feign.FeignException.errorStatus(FeignException.java:141)〜[feign-core-10.4.0.jar:na]在feign.FeignException.errorStatus(FeignException.java:133)〜[feign-core-10.4.0.jar:na]在feign.codec.ErrorDecoder $ Default.decode(ErrorDecoder.java:92)〜[feign-core-10.4.0.jar:na]在feign.SynchronousMethodHandler.executeAndDecode(SynchronousMethodHandler.java:151)〜[feign-core-10.4.0.jar:na]在feign.SynchronousMethodHandler.invoke(SynchronousMethodHandler.java:80)〜[feign-core-10.4.0.jar:na]在feign.ReflectiveFeign $ FeignInvocationHandler.invoke(ReflectiveFeign.java:103)〜[feign-core-10.4.0.jar:na]在com.sun.proxy。$ Proxy95.getUserById(未知来源)〜[na:na]在com.aurora.resource.resourceservice.controllers.UserDetailsResourceController.getUserById(UserDetailsResourceController.java:24)〜[classes /:na]在sun.reflect.NativeMethodAccessorImpl.invoke0(本机方法)〜[na:1.8.0_151]在sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)〜[na:1.8.0_151]在sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)〜[na:1.8.0_151]在java.lang.reflect.Method.invoke(Method.java:498)〜[na:1.8.0_151]在org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:190)〜[spring-web-5.2.2.RELEASE.jar:5.2.2.RELEASE]在org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:138)〜[spring-web-5.2.2.RELEASE.jar:5.2.2.RELEASE]在org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:106)〜[spring-webmvc-5.2.2.RELEASE.jar:5.2.2.RELEASE]在org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:888)〜[spring-webmvc-5.2.2.RELEASE.jar:5.2.2.RELEASE]在org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:793)〜[spring-webmvc-5.2.2.RELEASE.jar:5.2.2.RELEASE]在org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87)〜[spring-webmvc-5.2.2.RELEASE.jar:5.2.2.RELEASE]在org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1040)〜[spring-webmvc-5.2.2.RELEASE.jar:5.2.2.RELEASE]在org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:943)〜[spring-webmvc-5.2.2.RELEASE.jar:5.2.2.RELEASE]在org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006)〜[spring-webmvc-5.2.2.RELEASE.jar:5.2.2.RELEASE]在org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:898)〜[spring-webmvc-5.2.2.RELEASE.jar:5.2.2.RELEASE]在javax.servlet.http.HttpServlet.service(HttpServlet.java:634)〜[tomcat-embed-core-9.0.29.jar:9.0.29]在org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883)〜[spring-webmvc-5.2.2.RELEASE.jar:5.2.2.RELEASE]在javax.servlet.http.HttpServlet.service(HttpServlet.java:741)〜[tomcat-embed-core-9.0.29.jar:9.0.29]在org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231)〜[tomcat-embed-core-9.0.29.jar:9.0.29]在org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)〜[tomcat-embed-core-9.0.29.jar:9.0.29]在org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53)〜[tomcat-embed-websocket-9.0.29.jar:9.0.29]在org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)〜[tomcat-embed-core-9.0.29.jar:9.0.29]在org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)〜[tomcat-embed-core-9.0.29.jar:9.0.29]在org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100)〜[spring-web-5.2.2.RELEASE.jar:5.2.2.RELEASE]在org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119)〜[spring-web-5.2.2.RELEASE.jar:5.2.2.RELEASE]在org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)〜[tomcat-embed-core-9.0.29.jar:9.0.29]在org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)〜[tomcat-embed-core-9.0.29.jar:9.0.29]在org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93)〜[spring-web-5.2.2.RELEASE.jar:5.2.2.RELEASE]在org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119)〜[spring-web-5.2.2.RELEASE.jar:5.2.2.RELEASE]在org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)〜[tomcat-embed-core-9.0.29.jar:9.0.29]在org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)〜[tomcat-embed-core-9.0.29.jar:9.0.29]在org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201)〜[spring-web-5.2.2.RELEASE.jar:5.2.2.RELEASE]在org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119)〜[spring-web-5.2.2.RELEASE.jar:5.2.2.RELEASE]在org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)〜[tomcat-embed-core-9.0.29.jar:9.0.29]在org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)〜[tomcat-embed-core-9.0.29.jar:9.0.29]在org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:202)〜[tomcat-embed-core-9.0.29.jar:9.0.29]在org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96)[tomcat-embed-core-9.0.29.jar:9.0.29]在org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:526)[tomcat-embed-core-9.0.29.jar:9.0.29]在org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:139)[tomcat-embed-core-9.0.29.jar:9.0.29]在org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92)[tomcat-embed-core-9.0.29.jar:9.0.29]在org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74)[tomcat-embed-core-9.0.29.jar:9.0.29]在org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:343)[tomcat-embed-core-9.0.29.jar:9.0.29]在org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:367)上[tomcat-embed-core-9.0.29.jar:9.0.29]在org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65)上[tomcat-embed-core-9.0.29.jar:9.0.29]在org.apache.coyote.AbstractProtocol $ ConnectionHandler.process(AbstractProtocol.java:860)[tomcat-embed-core-9.0.29.jar:9.0.29]在org.apache.tomcat.util.net.NioEndpoint $ SocketProcessor.doRun(NioEndpoint.java:1591)[tomcat-embed-core-9.0.29.jar:9.0.29]在org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)上[tomcat-embed-core-9.0.29.jar:9.0.29]在java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)[na:1.8.0_151]在java.util.concurrent.ThreadPoolExecutor $ Worker.run(ThreadPoolExecutor.java:624)[na:1.8.0_151]在org.apache.tomcat.util.threads.TaskThread $ WrappingRunnable.run(TaskThread.java:61)[tomcat-embed-core-9.0.29.jar:9.0.29]在java.lang.Thread.run(Thread.java:748)[na:1.8.0_151]

这是我的主班:

@EnableFeignClients
@EnableEurekaClient
@SpringBootApplication
public class ResourceServiceApplication {
public static void main(String[] args) {
    SpringApplication.run(ResourceServiceApplication.class, args);
  }
}

这是我的FeignClient界面:

@FeignClient(name = "user-service")
public interface UserDetailsServiceFeign {

@PostMapping(value = "/saveUpdate")
UserDetailsDTO saveUpdate(@RequestBody UserDetailsDTO inputUser);

@GetMapping(value = "/getById/{id}")
UserDetailsDTO getUserById(@PathVariable(name = "id") Long id);

@GetMapping(value = "/getByName/{name}")
List<UserDetailsDTO> getUserByName(@PathVariable(name = "name") String name);

}

这是我的控制器api类

@RestController
@RequestMapping("/api")
public class UserDetailsResourceController {

@Autowired
private UserDetailsServiceFeign userDetailsServiceFeign;

@PostMapping(value = "/saveUpdate")
public UserDetailsDTO saveUpdate(@RequestBody UserDetailsDTO inputUser) {
    return userDetailsServiceFeign.saveUpdate(inputUser);
}

@GetMapping(value = "/getById/{id}")
public UserDetailsDTO getUserById(@PathVariable(name = "id") Long id) {
    return userDetailsServiceFeign.getUserById(id);
}

@GetMapping(value = "/getByName/{name}")
public List<UserDetailsDTO> getUserByName(@PathVariable(name = "name") String name) {
    return userDetailsServiceFeign.getUserByName(name);
}

}

这是我的conf属性:

spring:
  application:
    name: resource-service
eureka:
  client:
    registerWithEureka: true
    fetchRegistry: true
    serviceUrl:
      defaultZone: http://localhost:8661/eureka
  instance:
    hostname: localhost
server:
  port: 8182
spring microservices spring-cloud spring-cloud-feign
1个回答
0
投票

可悲的是,我忘记提及Feign接口中的映射前缀;这会导致路径误导。

© www.soinside.com 2019 - 2024. All rights reserved.