java - 如何在 Spring Boot 中处理 DeferredResult 中的异常?

标签 java spring spring-boot nonblocking

我有一个休息的方法:

@RequestMapping(value = "wash/washHistory", method = RequestMethod.GET, produces = "application/json;charset=UTF-8")
    @ResponseBody
    public DeferredResult<String> getWashHistory(@RequestParam(value = "sid", required = true, defaultValue = "") String sid,
            HttpServletResponse response, HttpServletRequest request,
            @RequestParam(value = "sort", defaultValue = "") String sortType,
            @RequestParam(value = "order", defaultValue = "") String order,
            @RequestParam(value = "limit", defaultValue = "") String limit,
            @RequestParam(value = "offset", defaultValue = "") String offset) {

        System.out.println("Thread: "+Thread.currentThread());
        final Integer managerId = checkSession(sid);      
        DeferredResult<String> defResult = new DeferredResult<>();
        new Thread(() -> {
                final String result = washController.getWashHistory( managerId, order, sortType, limit, offset);
                defResult.setResult(result);            
        }).start();
    return defResult;
    }

在“getWashHistory”中,我抛出以下自定义异常:

throw new InvalidUserInputException("Wrong offset", this.getClass().getSimpleName(), "getWashHist", params);

为了处理这个异常,我使用了以下类:

@ControllerAdvice
@EnableWebMvc
public class GlobalExceptionHandler {
 @ExceptionHandler(value = InvalidUserInputException.class)
    public ResponseEntity<String> invalidUserInputExc(InvalidUserInputException e) {
          logger.log("GMoika", e.error().getClassName(), e.error().getMethodName(), e.error().getParams(), e.error().getCause());
        return ResponseEntity.
                status(HttpStatus.BAD_REQUEST).
                body(e.error().getErrorCode());  
    }
}

只要我不使用 DeferredResult 就可以正常工作,但是当我想使用非阻塞方式时,会发生超时异常。 我找到了一种修复方法:

defResult.onTimeout(new Runnable() {
        @Override
        public void run() {
            defResult.setErrorResult("Explanation goes here.");
            response.setStatus(HttpServletResponse.SC_PARTIAL_CONTENT); //or SC_NO_CONTENT
        }
    });

但这不是我要找的,因为我用特定的构造函数抛出自己的异常,以在抛出此异常的类中写入原因。 在我的 GlobalExceptionHandler 类中是否有任何其他可能的方法来处理 DeferredResult 中的异常?

最佳答案

DeferredResult 有方法 setErrorResult 可以接受异常并根据 documentation :

The value may be an Exception or Throwable in which case it will be processed as if a handler raised the exception.

关于java - 如何在 Spring Boot 中处理 DeferredResult 中的异常?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45214346/

相关文章:

java - Spring Boot 客户端应用程序中未加载属性

spring-boot - 在 Spring Boot 中构建分层 jar 时,如何在层中包含多模块项目 jar?

java - 使用spring boot(安全)和keycloak启用角色身份验证?

java - 如何在 FileOutputStream 的 tex 文件上创建新行

java - 按数组列表自定义分页

java - 当可以使用旧变量时,为什么要创建并使用新变量呢?

java - 确保密码不包含字典单词

java - Proguard混淆后如何保留@PathVariable参数名称

Java MouseListener 在按下鼠标时禁用 MouseMotionListener

java - unitils-orm-hibernate 不适用于 Hibernate 5