Spring佯装客户端调用在应该停留在try块时进入异常块

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

需要一些关于Spring的小帮助。所以情况是这样的,

我有两个Spring引导服务。比如说服务A和服务B。我已经用外型客户机配置了我的服务A,通过它我调用了服务B方法

这是我的服务A的代码

我的伪装配置界面

@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