捕获所有异常并返回带有消息列表的异常

时间:2019-03-06 09:34:09

标签: java spring spring-boot

我想知道是否有任何优雅的方法来捕获所有异常(特别是自定义运行时异常)并返回包含消息列表的异常。

例如,大异常而不是包含String消息,而是包含String []消息。

场景:

使用包含一堆字段的JSON对象向后端发出REST请求。我想在后端验证这些字段,并在发生任何异常时返回错误列表。

如果不能同时输入name和lastname字段,那么我不想在无效名称上引发异常,并让用户更改名称并再次提交,只是得到一条错误消息,指出lastname也无效

为什么我要收集所有无效输入并以异常形式返回这些列表。

2 个答案:

答案 0 :(得分:1)

Spring将JSR-303 / JSR-349 bean验证失败收集到BindException中:

  

当绑定错误被认为是致命错误时抛出。实现BindingResult接口(及其超级接口Errors)以允许直接分析绑定错误。

您可能需要阅读3. Validation, Data Binding, and Type Conversion并遵循标准,而不是开发自己的bean验证机制。

答案 1 :(得分:0)

使用Spring Boot,您可以使用以下注释来处理类或方法的任何异常:

@ExceptionHandler(YourExceptionHandler.class)

您可以创建一个类,让您重新分组所有自定义异常管理,就像这样(如果您想收集它):

@ControllerAdvice
class GlobalControllerExceptionHandler {
    @ResponseStatus(HttpStatus.CONFLICT)  // 409
    @ExceptionHandler(DataIntegrityViolationException.class)
    public void handleConflict() {
        // Nothing to do
    }
}

您还可以实现HandlerExceptionResolver接口来管理控制器未处理的所有异常(所有其他运行时异常)

public interface HandlerExceptionResolver {
    ModelAndView resolveException(HttpServletRequest request, 
            HttpServletResponse response, Object handler, Exception ex);
}

此处详细介绍了所有内容:https://spring.io/blog/2013/11/01/exception-handling-in-spring-mvc

编辑:我刚刚读到您添加的场景。实际上,对于特殊情况,您应该只解析对象,然后返回一个异常(例如错误的对象格式,以及400 HTTP状态代码错误,以及包含所有无效字段的自定义消息。)。 >