簡體   English   中英

根據條件的 Javax 驗證消息

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM