弹簧云打开外部状态404



我正在处理一个错误服务示例,我有4个微服务:-尤里卡服务器(发现)-网关服务(zuul代理)-资源服务(外部客户端)-用户服务(用户crud示例)

一切都很好;即使我通过代理调用用户服务api,它也能完美地工作;但我的目标是使用foreign客户端调用用户服务api,此时我得到错误

foreign.FeignException$NotFound:状态404正在读取UserDetailsServiceFeign#getUserById(Long)

Stacktrace:

foreign.FeignException$NotFound:状态404正在读取UserDetailsServiceFeign#getUserById(Long)在foreign。FeignException.clientErrorStatus(FeignExclusion.java:165)~[feign-core-10.4.0.jar:na]在foreign。FeignException.errorStatus(FeignException.java:141)~[feign-core-10.4.0.jar:na]在foreign。FeignException.errorStatus(FeignException.java:133)~[feign-core-10.4.0.jar:na]在foreign.coodec.ErrorDecoder$Default.decode(ErrorDecoder.java:92)~[feign-core-10.4.0.jar:na]在foreign。SynchronousMethodHandler.executeAndDecode(SynchronousMethod Handler.java:151)~[feign-core-10.4.0.jar:na]在foreign。SynchronousMethodHandler.invoke(SynchronousMethod Handler.java:80)~[feign-core-10.4.0.jar:na]在foreign。ReflectiveFeign$FeignInvocationHandler.invoke(ReflectiveFeign.java:103)~[feign-core-10.4.0.jar:na]网址:com.sun.proxy.$Proxy95.getUserById(未知来源)~[na:na]网址:com.aurora.resource.resourceservice.controller.UserDetailsSourceController.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.ioke(Method.java:498)~[na:1.8.0_151]位于org.springframework.web.method.support.InvocaleHandlerMethod.doInvoke(InvocableHandlerMethod.java:190)~[spring-web-5..2.RELEASE.jar:5.2.2.RELEASE]位于org.springframework.web.method.support.InvocaleHandlerMethod.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(RequestMappingHandledAdapter.java:793)~[spring-webmvc-5.2.2.RELEASE.jar:5.2.2.RELEASE]位于org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethod Adapter.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.httpHttpServlet.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.httpHttpServlet.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-90.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(OncePerRequest filter.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(OncePerRequest filter.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(CharacterEncoding filter.java:201)~[spring-web-5..2.RELEASE.jar:5.2.2.RELEASE]网址:org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequest filter.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.StandardWrapperValv.invoke(StandardWrapperValve.java:202)~[tomcat-embed-core-9.0.29.jar:9.0.29]网址:org.apache.catalina.core.StandardContextValv.invoke(StandardContextValv.java:96)[tomcat-embed-core-9.0.29.jar:9.0.29]网址:org.apache.catalina.authenticator.AuthenticatorBase.ioke(AuthenticatorBase.java:526)[tomcat-embed-core-9.0.29.jar:9.0.29]网址:org.apache.catalina.core.StandardHostValv.invoke(StandardHostValve.java:139)[tomcat-embed-core-9.0.29.jar:9.0.29]网址:org.apache.catalina.vvals.ErrorReportValv.invoke(ErrorReportValve.java:92)[tomcat-embed-core-9.0.29.jar:9.0.29]网址:org.apache.catalina.core.StandardEngineValv.invoke(StandardEngineValv.java:74)[tomcat-embed-core-9.0.29.jar:9.0.29]网址:org.apache.catalina.connecter.CoyoteAdapter.service(Coyotedapter.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.produce(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.ThreadPoolExecutiator.runWorker(ThreadPoolExecutiator.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

遗憾的是,我忘了在Feign接口中提到映射前缀;这导致路径误导。

最新更新