4

我有一个控制器建议来处理我的 REST 控制器中的异常行为,我遇到了一种情况,即我必须有条件地处理SQLIntegrityConstraintViolationException具有特定消息的消息(用于重复键的消息),返回 a 409,让其他消息由默认处理程序(返回500错误代码)。

我正在考虑两种可能的方法来实现这一目标:

  1. 在我的条件下,在 else 分支上抛出一个新的准系统Exception,所以处理是由 Spring 完成的。
  2. 显式调用通用异常处理程序(例如return handleGeneralException(exception)从我的 else 分支内部)。

我有一种“正确”的方法可以将我的一种异常的一小部分传递ControllerAdvice给另一个处理程序,而不是“原始”处理程序?

编辑1:我想在我的ControllerAdvice中做这样的事情:

if (exception.getMessage.contains("something")) {
    // handle exception
} else {
    // pass to other handler
}
4

2 回答 2

0

有一个自定义异常类,然后当您将其SQLIntegrityConstraintViolationException 包装在您的自定义异常类中时,您可以在控制器建议中访问任何您希望可以访问的附加字段。处理控制器建议类中的自定义异常。

@ControllerAdvice
public class CustomExceptionHandler {

    @ExceptionHandler(YourCustomException.class)
    public final ResponseEntity<ExceptionResponse> handleNotFoundException(YourCustomExceptionex,
            WebRequest request) {
        ExceptionResponse exceptionResponse = new ExceptionResponse(new Date(), ex.getMessage(),
                request.getDescription(false), HttpStatus.NOT_ACCEPTABLE.getReasonPhrase());
        return new ResponseEntity<>(exceptionResponse, HttpStatus.CONFLICT);
    }

}

在您的代码中使用 try catch 块来处理此异常时,请确保您处理DataIntegrityViolationException而不是SQLIntegrityConstraintViolationException使用Spring Data JPA。因此,如果您使用的是 Spring Data Jpa,那么:

try {
    anyRepository.save(new YourModel(..));
} catch (DataIntegrityViolationException e) {
    System.out.println("history already exist");in res
    throw New YourCustomException("additional msg if you need it ", e);
}
于 2020-08-12T13:22:15.483 回答
0

下面的代码将在ControllerAdbvice中捕获异常SQLIntegrityConstraintViolationException的错误消息,而无需在代码中处理

@ControllerAdvice
public class CustomGlobalExceptionHandler extends ResponseEntityExceptionHandler {
@ExceptionHandler(value = DataIntegrityViolationException.class)
public ResponseEntity<ExceptionResponse> dataIntegrityViolationExceptionHandler(Exception ex) {
ExceptionResponse response = new ExceptionResponse();
    Throwable throwable = ex.getCause();
    while (throwable != null) {
        if (throwable instanceof SQLIntegrityConstraintViolationException) {
            String errorMessage = throwable.getMessage();
            response.setErrors(new ArrayList<>(Arrays.asList(errorMessage)));
        }
        throwable = throwable.getCause();
    }       
    return new ResponseEntity<Object>(response, HttpStatus.CONFLICT);
}
}
于 2020-08-12T15:20:14.813 回答