2016-12-02 91 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,這將給你違反約束內的預期消息馬上得到更好的解決。