【问题标题】:Cascading validations in Spring using the default validator在 Spring 中使用默认验证器进行级联验证
【发布时间】: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


    【解决方案1】:

    让我们从以下代码开始:

    class PersonService (): Validator() {
        fun save(person: Person) {
             validate(person)
             // more logic that assumes data is valid
             repository.save(person)
        }
    }
    

    现在我们将使用扩展方法重写它:

    class PersonService (): Validator() {
        fun save(person: Person) {
             person.validate()
             // more logic that assumes data is valid
             repository.save(person)
        }
    }
    

    此函数的存根可能如下所示:

    private fun Person.validate() {
        val factory = Validation.buildDefaultValidatorFactory()
        val validator = factory.validator
    
        val validationResult = validator.validate(this).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)
        }
    
    
        validationResult.addAll(job.validate())
    
        return validationResult
    }
    

    工作重复相同的模式:

    private fun Job.validate() {
       ...
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-10-30
      • 1970-01-01
      • 1970-01-01
      • 2015-11-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-02-10
      相关资源
      最近更新 更多