[英]Javax validation message according to condition
我在 Kotlin 中有一個 Spring 引導項目,它使用自定義語言環境攔截器來了解它從哪個.properties
文件加載消息。 這工作得很好。 我還有一個自定義注釋,它很簡單並且有一個默認的消息值,如下所示:
@Target(AnnotationTarget.Field)
@Constraint(validatedBy = [MyCustomValidator::class])
annotation class MyAnnotation(
val message: String = "{javax.validation.constraints.MyAnnotation.message}",
val groups: Array<KClass<*>> = [],
val payload: Array<KClass<out Payload>> = []
)
class MyCustomValidator : ConstraintValidator<MyAnnotation, String> {
override fun isValid(value: String, context: ConstraintValidatorContext) {
return true //Just to make it easy
}
}
語言環境屬性文件包含鍵MyAnnotation.value=This field is required
的並顯示為異常消息。
問題是當我想添加更多驗證時,根據每個條件自定義消息。 我讀到我應該禁用默認約束驗證器並添加消息,但它不起作用。
例如,如果我想在語言環境文件中創建一個鍵為MyAnnotation.conditionOne
,它仍然會打印來自MyAnnotation.value
的消息。
//The only thing that changes in MyAnnotation is that message: String = ""
//Assuming that ConditionOne and ConditionTwo has a isValid static method
class MyCustomValidator : ConstraintValidator<MyAnnotation, String> {
override fun isValid(value: String, context: ConstraintValidatorContext): Boolean {
context.disableDefaultConstraintViolation()
return if (!ConditionOne.isValid(value)) {
context
.buildConstraintViolationWithTemplate("{javax.validation.constraints.MyAnnotation.conditionOne}")
.addConstraintViolation()
false
}
else if (!ConditonTwo.isValid(value)) {
context
.buildConstraintViolationWithTemplate("{javax.validation.constraints.MyAnnotation.message}")
.addConstraintViolation()
false
}
else
true
}
}
這是設置消息的正確方法嗎?
正如我在上面的示例中看到的那樣,您添加了兩個違反約束的消息,但在不同的if
情況下。 要從一個驗證器獲取多個檢查和違規消息,您不應該在每個if
案例之后放置return
,而不是這個,您可以創建一個本地 boolean 變量並從每個if
語句案例中設置其值,然后return
該變量.
注意一點:對於你的驗證器來說,正確設置一個臨時的 boolean 變量很重要,因為如果你的if
設置為false
,則意味着最終返回值應該是false
。 因為有一個原則anyMatch(false)
或allMatch(true)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.