Java 如何处理延迟中的异常导致Spring启动?

Java 如何处理延迟中的异常导致Spring启动?,java,spring,spring-boot,nonblocking,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, def

我有一个休息的方法:

@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;
    }
为了处理此异常,我使用以下类:

@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());  
    }
}
但这并不是我想要的,因为我抛出了自己的异常,并使用特定的构造函数在抛出该异常的类中编写原因。
在我的GlobalExceptionHandler类中,是否有任何其他可能的方法来处理DelferredResult中的异常?

DelferredResult
具有方法
setErrorResult
,该方法可以根据以下条件处理异常:

该值可以是异常值或可丢弃值,在这种情况下将是异常值 处理过程就像处理程序引发异常一样


@在大多数情况下,jny的决定是正确的,但对我来说,我找到了另一种方法 在我的rest控制器中,我添加了以下代码:

new Thread(() -> {          
            Thread.currentThread().setUncaughtExceptionHandler(new SeparateThreadsExceptionHandler(defResult));
            final String result = washController.getWashHistory(managerId, order, sortType, limit, offset);
            defResult.setResult(result);
        }).start();
和一个SeparateThreadsExceptionHandler类:

public class SeparateThreadsExceptionHandler implements Thread.UncaughtExceptionHandler{
    private DeferredResult<String> dr;
    public SeparateThreadsExceptionHandler(DeferredResult<String> dr){
        this.dr = dr;
    }
    @Override
    public void uncaughtException(Thread t, Throwable e) {
        if(e instanceof InvalidUserInputException){
           InvalidUserInputException throwableException =  (InvalidUserInputException)e;
            dr.setResult(throwableException.error().getErrorCode());
        } else {
            dr.setResult(UnknownException.UNKNOWN_ERROR_CODE);
        }
    }

}
公共类SeparateThreadsExceptionHandler实现Thread.UncaughtExceptionHandler{
私人延迟结果dr;
public SeparateThreadsExceptionHandler(延迟结果dr){
this.dr=dr;
}
@凌驾
公共无效未捕获异常(线程t,可丢弃的e){
if(例如InvalidUserInputException的实例){
InvalidUserInputException throwableException=(InvalidUserInputException)e;
dr.setResult(throwableeexception.error().getErrorCode());
}否则{
dr.setResult(未知异常。未知错误代码);
}
}
}
当抛出自定义异常时,我可以将一些字符串错误消息设置为DeferredResult。在我的示例中,它是前端的错误代码

在我的GlobalExceptionHandler类中,有没有其他可能的方法来处理DelferredResult中的异常

我使用了@jny指出的
setErrorResult
方法

以下是我的控制器方法的主体:

DeferredResult<Wrapper<Object>> deferredResult = new DeferredResult<>();

ForkJoinPool.commonPool().submit(() -> {
    try {
        Wrapper<Object> response = ...
        deferredResult.setResult(response);
    } catch (Exception e) {
        deferredResult.setErrorResult(e);
    }
});

return deferredResult;
DeferredResult-DeferredResult=new-DeferredResult();
ForkJoinPool.commonPool().submit(()->{
试一试{
包装器响应=。。。
deferredResult.setResult(响应);
}捕获(例外e){
延迟结果。设置错误结果(e);
}
});
返回延迟结果;

在这种情况下,新线程中抛出的异常被传递到global@ExceptionHandler

这不是我想要的,因为我的GlobalExceptionHandler中有一些业务逻辑,因此我需要处理这个类中的异常。我相信这正是将要发生的。将在
setErrorResult
中设置的异常将由您的
GlobalExceptionHandler
处理。谢谢,但我找到了另一种方法=)
public class SeparateThreadsExceptionHandler implements Thread.UncaughtExceptionHandler{
    private DeferredResult<String> dr;
    public SeparateThreadsExceptionHandler(DeferredResult<String> dr){
        this.dr = dr;
    }
    @Override
    public void uncaughtException(Thread t, Throwable e) {
        if(e instanceof InvalidUserInputException){
           InvalidUserInputException throwableException =  (InvalidUserInputException)e;
            dr.setResult(throwableException.error().getErrorCode());
        } else {
            dr.setResult(UnknownException.UNKNOWN_ERROR_CODE);
        }
    }

}
DeferredResult<Wrapper<Object>> deferredResult = new DeferredResult<>();

ForkJoinPool.commonPool().submit(() -> {
    try {
        Wrapper<Object> response = ...
        deferredResult.setResult(response);
    } catch (Exception e) {
        deferredResult.setErrorResult(e);
    }
});

return deferredResult;