2011-11-17 60 views
1

运行ex.getMessage()插值消息给我:如何获得对Hibernate的ValidationException验证

Property 'firstname' threw exception; nested exception is javax.validation.ValidationException: 
Error validating field firstname of class com.inferoquest.entity.Employee: 
[ConstraintViolationImpl{interpolatedMessage='Name cannot be shorter than 2 characters', 
propertyPath=firstname, rootBeanClass=class com.inferoquest.entity.Employee, 
messageTemplate='Name cannot be shorter than 2 characters'}] 

从中我想提取Name cannot be shorter than 2 characters。 更新:也许我还应该补充说,我想以干净的方式做到这一点,而不是通过正则表达式:-)

我已经看到this关于这个问题的线程。它的答案可能包含我的解决方案,但说实话,我认为这样一个简单的任务看起来过于复杂,并且实际上不能很好地理解它。

任何想法?

回答

3

A ConstraintViolationException包装了一套ConstraintViolations(有关更多详细信息,请参阅JavaDoc)。您可以通过调用getConstraintViolations()上捕获的异常来获取这些违规,遍历该集合并生成包含所有违规消息的消息。

+0

这就是问题所在,它是抛出的ValidationException而不是ConstraintViolationException,并且抛出异常似乎并没有让我有任何好处。有任何想法吗? –

+0

哪一层/框架抛出异常? 'ValidationException'源自哪里?也许它有一个'ConstraintViolationException'作为原因? – Gunnar

0

执行到上述解决方案。

@RestControllerAdvice(basePackageClasses = RepositoryRestExceptionHandler.class) 
public class GlobalExceptionHandler { 

    @ExceptionHandler(ConstraintViolationException.class) 
    public ResponseObject handleConstaintViolatoinException(final ConstraintViolationException ex) { 

    StringBuilder message = new StringBuilder(); 
    Set<ConstraintViolation<?>> violations = ex.getConstraintViolations(); 
    for (ConstraintViolation<?> violation : violations) { 
     message.append(violation.getMessage().concat(";")); 
    } 
    return new ResponseObject(HttpStatus.PRECONDITION_FAILED.value(), message.toString()); 
    } 
}