Spring佯装客户端调用在应该停留在try块时进入异常块
需要一些关于Spring的小帮助。所以情况是这样的, 我有两个Spring引导服务。比如说服务A和服务B。我已经用外型客户机配置了我的服务A,通过它我调用了服务B方法 这是我的服务A的代码 我的伪装配置界面Spring佯装客户端调用在应该停留在try块时进入异常块,spring,spring-boot,exception-handling,spring-cloud-feign,feign,Spring,Spring Boot,Exception Handling,Spring Cloud Feign,Feign,需要一些关于Spring的小帮助。所以情况是这样的, 我有两个Spring引导服务。比如说服务A和服务B。我已经用外型客户机配置了我的服务A,通过它我调用了服务B方法 这是我的服务A的代码 我的伪装配置界面 @FeignClient(name = "FeignClient", url = "http://localhost:8081/ServiceB/hello") public interface FeignApi { @RequestMapping(method = Request
@FeignClient(name = "FeignClient", url = "http://localhost:8081/ServiceB/hello")
public interface FeignApi {
@RequestMapping(method = RequestMethod.GET)
ResponseEntity<?> hello();
}
我的控制器建议处理我手动抛出的异常
@ControllerAdvice
public class MyControllerAdvice {
@ExceptionHandler
@ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)
public ResponseEntity<?> handleException(Exception exception, Model model) {
return new ResponseEntity<>("Caused due to : " + exception.getMessage(), HttpStatus.INTERNAL_SERVER_ERROR);
}
}
这是我不明白的。如果我使用控制器建议管理了服务B异常,并以ResponseEntity的形式将响应发送回服务A,那么服务A的流如何进入catch块。我希望它只停留在try块中,因为我想根据数据进行进一步处理
知道吗,我怎么才能避开这件事?或者,即使我使用控制器建议来管理异常,它的行为也是这样吗?在这种情况下,预期的行为应该是什么
请注意。默认情况下,对于任何错误情况,Faign都会抛出FaignException。 使用回退机制来处理故障
@FeignClient(name = "FeignClient", url = "http://localhost:8081/ServiceB/hello", fallback= FeignApiFallback.class)
public interface FeignApi {
@RequestMapping(method = RequestMethod.GET)
ResponseEntity<?> hello();
}
@Component
class FeignApiFallback implements FeignApi {
@Override
public ResponseEntity<?> hello() {
//do more logic here
return ResponseEntity.ok().build();
}
}
除200以外的任何状态,冒充客户端都将其视为异常,并且在控制器建议中设置HtpStasUn.InnalAlxServError错误。
您可以使用自定义错误解码器请参阅谢谢您的回复。当我通过提供回退详细信息来添加这个新组件时,我仍然无法获得该方法中的控件?就像我刚刚添加了一个sysout来查看流是否到达那里,但它只是跳过了它。回退方法将如何帮助我从服务B获取错误并使流仅保持在try块中?如果这是直截了当的话,我很抱歉,但我是新手,所以请让我知道。另外,当我尝试在属性文件中添加“feign.hystrix.enabled=true”时,它会显示“feign.hystrix.enabled”是未知属性。我不知道为什么:(如果你想知道在这种情况下会出现什么错误,你必须进行自定义处理或使用自定义解码器。我可以与你分享一些链接,这些链接将对你有所帮助。。如果Fallback属性被正确定义为@FaignClient annotation,并且可以作为bean使用,那么Fallback将参与其中。请更新代码,找出为什么不调用它。@WebNoob制作了一个示例。)在这里:
@ControllerAdvice
public class MyControllerAdvice {
@ExceptionHandler
@ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)
public ResponseEntity<?> handleException(Exception exception, Model model) {
return new ResponseEntity<>("Caused due to : " + exception.getMessage(), HttpStatus.INTERNAL_SERVER_ERROR);
}
}
"Service A Exception block reached."
@FeignClient(name = "FeignClient", url = "http://localhost:8081/ServiceB/hello", fallback= FeignApiFallback.class)
public interface FeignApi {
@RequestMapping(method = RequestMethod.GET)
ResponseEntity<?> hello();
}
@Component
class FeignApiFallback implements FeignApi {
@Override
public ResponseEntity<?> hello() {
//do more logic here
return ResponseEntity.ok().build();
}
}
feign.hystrix.enabled=true