如何在Spring中处理DataIntegrityViolationException?

时间:2010-01-21 13:25:48

标签: java spring exception-handling spring-mvc

我需要在Spring 3.0应用程序中显示自定义消息。我有一个Hibernate数据库,有几个约束。我怀疑应如何以良好的方式处理DataIntegrityViolationException。我想知道是否有一种方法可以在属性文件中使用消息集映射异常,因为它可以在约束验证中使用。我能以任何方式自动处理它,或者我必须在每个控制器中捕获此异常吗?

3 个答案:

答案 0 :(得分:8)

在违反约束的情况下显示用户友好消息的问题是,当Hibernate的ConstraintViolationException被转换为Spring的DataIntegrityViolationException时,约束名称将丢失。

但是,您可以自定义此翻译逻辑。如果您使用LocalSessionFactoryBean来访问Hibernate,则可以为其提供自定义SQLExceptionTranslator(请参阅LocalSessionFactoryBean.jdbcExceptionTranslator)。此异常转换器可以将ConstraintViolationException转换为您自己的异常类,并保留约束名称。

答案 1 :(得分:4)

Spring 3提供了两种处理方式 - beans.xml中的HandlerExceptionResolver或控制器中的@ExceptionHandler。它们都做同样的事情 - 它们将异常转换为渲染视图。

两者均记录在案here

答案 2 :(得分:0)

1。在您的请求正文类中,检查是否不为null或不为空

public class CustomerRegisterRequestDto {
    @NotEmpty(message = "first name is empty")
    @NotNull(message = Constants.EntityValidators.FIRST_NAME_NULL)
    private String first_name;
    //other fields
    //getters and setters
}

2。然后在您的服务中检查这个

ValidatorFactory factory = Validation.buildDefaultValidatorFactory();
    Validator validator = factory.getValidator();
    Set<ConstraintViolation<CustomerRegisterRequestDto>> violations = validator.validate(userDto);
    if (!violations.isEmpty()) {
        //something is wrong in request parameters
        List<String> details = new ArrayList<>();
        for (ConstraintViolation<CustomerRegisterRequestDto> violation : violations) {
            details.add(violation.getMessage());
        }
        ErrorResponse error = new ErrorResponse(Constants.ErrorResponse.REQUEST_PARAM_ERROR, details);
        return new ResponseEntity<>(error, HttpStatus.BAD_REQUEST);
    }

3。 Here是您的ErrorResponse类