繁体   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