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