【发布时间】:2019-01-17 07:04:52
【问题描述】:
我正在手动验证我的实体类。考虑一个人实体:
data class Person (
@get:NotNull var firstName: String = ""
)
我的验证逻辑位于服务可以使用的抽象类中。
abstract class Validator {
protected fun validate(model: Any): ValidationResult {
val factory = Validation.buildDefaultValidatorFactory()
val validator = factory.validator
val validationResult = validator.validate(model).fold(ValidationResult()) { validationResult, violation ->
val message = violation.propertyPath.toString() + " - " + violation.message
validationResult.add(message)
validationResult
}
// Raise a validation exeception
if (validationResult.isValid()) {
throw ValidationException(validationResult)
}
return validationResult
}
}
这让我可以编写这样的服务。
class PersonService (): Validator() {
fun save(person: Person) {
validate(person)
// more logic that assumes data is valid
repository.save(person)
}
}
优点是我可以将这个验证器添加到我计划在未来编写的服务中。这很有效,但是让我们对 person 类进行更改:
data class Person (
@get:NotNull var firstName: String = "",
var job: Job = Job()
)
现在我们有一个属于 Person 的作业类。作业有自己的验证。
data class Job (
@get:NotNull var department: String = "",
@get:Min(0) var salary: Integer = "",
)
我想要的也是在 Job 类上调用我的验证器。这将允许验证逻辑保持通用。有没有办法将验证级联到作为被调用的原始类的一部分的对象成员
【问题讨论】:
标签: java spring validation kotlin