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