2016-12-02 36 views
2

我写了一个异常映射器来覆盖Hibernate Validator生成的响应,所以我可以对回复中的消息进行一些控制。Hibernate Validator:覆盖约束违规消息传递

我的问题是,我很难找到一个简单的方法来“切换”违反约束的类型,因此,我无法编写自定义消息。理想情况下,我可以根据注释开关,并在响应中返回自定义消息。理想情况下,它看起来像这样:

@Override 
public Response toResponse(ConstraintViolationException exception) { 

    ConstraintViolation violation = exception.getConstraintViolations().iterator().next(); 

    String message = null; 
    switch (violation.getType()) { 
     case SomeEnum.NOT_NULL: 
      message = "It's not null!"; 
      break; 
     default: 
      message = "Other message!"; 
    } 

    ... 
} 

是这样简单的事情吗?

+0

这不是一个好方法 - 如果你想国际化这些消息怎么办?如果你要走这条路,就把注释的'消息'作为一个键,并使用普通的消息包。请参阅开箱即用约束注释的默认值。 – chrylis

+0

我已经有一个处理国际化的字符串文件。我简化了这个例子,这样就不会成为焦点。我在这里感兴趣的是选择正确消息的机制,而不是从哪里检索。 – Brandon

回答

1

ConstraintViolation#getConstraintDescriptor()应该对您有所帮助。除其他事项外,返回的描述符公开违反约束注释类型:

if (violation.getConstraintDescriptor().getAnnotation().annotationType() == NotNull.class) { ... } 

话虽这么说,这个问题可以通过实现自定义MessageInterpolator,这将给你违反约束内的预期消息马上得到更好的解决。