首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >我们如何使用带有弹簧网络流量的@ExceptionHandler?

我们如何使用带有弹簧网络流量的@ExceptionHandler?
EN

Stack Overflow用户
提问于 2018-03-06 18:02:50
回答 3查看 24.8K关注 0票数 17

在spring中,我们可以使用注释@ExceptionHandler来处理服务器和控制器的客户端错误。

我尝试过在web流量控制器中使用这个注释,但经过一些调查后,我发现了这里

Spring反应性的情况要复杂得多。由于响应流是由与执行控制器方法的线程不同的线程计算的,因此异常不会自动传播到控制器线程。这意味着@ExceptionHandler方法只适用于直接处理请求的线程中引发的异常。如果要使用@ExceptionHandler特性,则必须将流中抛出的异常传播回线程。这似乎有点令人失望,但在编写本文时,Spring 5仍未发布,因此错误处理可能会变得更好。

因此,我的问题是如何将异常传播回线程。有关于使用@ExceptionHandler和Spring流量的好示例或文章吗?

更新:从spring.io看,它看起来是受支持的,但仍然缺乏一般的理解

谢谢,

EN

回答 3

Stack Overflow用户

发布于 2021-02-09 22:18:28

现在可以在Spring中使用@ExceptionHandler以及@RestControllerAdvice甚至@ControllerAdvice

示例:

  1. 添加the流量依赖项 org.springframework.boot弹簧-启动-启动-网络流量
  2. 创建类ExceptionHandler @RestControllerAdvice公共类ExceptionHandlers {私有静态最终日志记录器= @ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR) @ExceptionHandler(Exception.class) @ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)公共字符串serverExceptionHandler(异常ex) { LOGGER.error(ex.getMessage(),ex);返回ex.getMessage();}}
  3. 创建控制器 @GetMapping(value = "/error",produces = MediaType.APPLICATION_JSON_UTF8_VALUE)公共Mono exceptionReturn() {返回Mono.error(新RuntimeException(“测试错误”));}

此处提取的示例:

https://ddcode.net/2019/06/21/spring-5-webflux-exception-handling/

票数 12
EN

Stack Overflow用户

发布于 2018-06-17 22:01:09

不是对原始问题的确切回答,而是将您的异常映射到http响应状态的一个快速方法是抛出org.springframework.web.server.ResponseStatusException /或创建您自己的子类。

对http响应状态+ spring的完全控制将添加一个带有添加reason选项的响应体。

代码语言:javascript
复制
{
    "timestamp": 1529138182607,
    "path": "/api/notes/f7b.491bc-5c86-4fe6-9ad7-111",
    "status": 400,
    "error": "Bad Request",
    "message": "For input string: \"f7b.491bc\""
}
票数 6
EN

Stack Overflow用户

发布于 2022-03-22 14:14:55

下面的全局错误处理程序为我完成了这个任务:

代码语言:javascript
复制
import org.springframework.web.server.ResponseStatusException;  
    
    @Slf4j
    @RestControllerAdvice
    @ConditionalOnWebApplication(type = ConditionalOnWebApplication.Type.REACTIVE)
    public class MyCustomReactiveErrorHandling {
    
     @ExceptionHandler(MyCustomNotFoundException.class)
      public void handleMyCustomException(MyCustomNotFoundException ex) {
        throw new ResponseStatusException(404, "Data not found!", ex);
      }
    
    }

抛出我的异常会在rest服务中返回正确的http状态代码。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49137253

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档