2015-12-23 103 views
1

我正在使用ValidationRulesServlet爲我的API生成valdr JSON。目前產生的JSON看起來是這樣的:來自生成的JSON中ValidationMessages.properties的消息

{ 
    "Person" : { 
    "firstName" : { 
     "size" : { 
     "min" : 2, 
     "message" : "{javax.validation.constraints.Size.message}", 
     "max" : 2147483647 
     }, 
     "required" : { 
     "message" : "{javax.validation.constraints.NotNull.message}" 
     } 
    }, 
    "lastName" : { 
     "size" : { 
     "min" : 2, 
     "message" : "{javax.validation.constraints.Size.message}", 
     "max" : 20 
     }, 
     "required" : { 
     "message" : "{javax.validation.constraints.NotNull.message}" 
     } 
    } 
    } 
} 

我用的球衣我REST服務,我想在上面JSON的messages要與值從ValidationMessages.properties取代。我的ValidationMessages.properties位於classpath(src/main/resources),由Jackson正確使用。這可以通過調用具有無效值的REST端點來確認。下面是一個例子響應:

[ 
    { 
    "message": "Must be between 2 and 2147483647 characters", 
    "messageTemplate": "{javax.validation.constraints.Size.message}", 
    "path": "PersonServiceImpl.updatePerson.arg0.firstName", 
    "invalidValue": "" 
    } 
] 

在相應消息中我ValidationMessages.properties

javax.validation.constraints.Size.message = Must be between {min} and {max} characters 

如何從ValidationMessages.properties得到valdr JSON來輸出消息,而不是例如{javax.validation.constraints.Size.message}

回答

1

你不能,至少不能開箱即用。如果您檢查Bean驗證規範或看的原因是很明顯的Constraint Javadoc

每個約束註解必須承載以下屬性:

  • 字符串消息()默認的[...]它應該默認爲由約束條件爲 的完全限定類名稱後跟.message組成的錯誤消息密鑰。例如 {com.acme.constraints.NotSafe.message}

所以,在valdr約束本質"message" : "{javax.validation.constraints.Size.message}" JSON表示消息關鍵而不是實際的驗證message。國際海事組織更明智的做法是調用JSON屬性messageKey來做到這一點,但我們希望堅持使用Bean驗證術語。事實上,JSON中的所有屬性都是從Bean Validation Constraint中提取的。

因此,如果違反了Person.firstName.size約束條件,則需要在AngularJS前端中顯示「必須介於2和2147483647之間的字符」。 valdr通過integrating well with angular-translate實現。 您需要做的就是讓您的ValidationMessages.properties可用於前端,並使用該文件中的消息初始化角度翻譯。

+0

我很害怕這種情況。我明白你的觀點,但仍然認爲,如果Valdr每次定義都使用消息而不是密鑰,那麼它就會有意義。使用Jersey,你甚至可以使用'Constraint'的'message'屬性作爲實際的消息,例如'@Size(min = 2,message =「至少2個字符」)'。如果Valdr以同樣的方式使用這個屬性,我會很喜歡。 –

+0

它的確如此。如果在Java類中定義了「Constraint#message」,則消息將以valdr JSON而不是(默認)消息密鑰結束。沒有魔術,沒有什麼特定於Jersey或valdr,它只是Java Bean驗證的工作原理。我們對此有一個單元測試,在https://github.com/netceteragroup/valdr-bean-validation/blob/master/valdr-bean-validation/src/test/java/com/github/valdr/ConstraintParserTest.java #L86如果你想看代碼。 –