Spring4.0中的动态验证

Spring4.0中的动态验证,spring,validation,bean-validation,spring-validator,Spring,Validation,Bean Validation,Spring Validator,我已经构建了一个SpringREST服务(Spring4.0和Java8),我还有一个Employee REST服务,其中Employee类具有以下属性 姓名、年龄、性别、工资、职务、公司id、假期权利、经理姓名和国家 我希望使用Spring4.0编写一个验证层,该验证需要基于员工所在国家/地区进行动态验证 预期验证 员工姓名、年龄、性别和国家是强制性的 员工性别必须为男性或女性 员工年龄不得超过70岁,也不得低于18岁 比如说 如果国家为英国,则假期权利不得超过25天 如果国家为美国,则假期权

我已经构建了一个SpringREST服务(Spring4.0和Java8),我还有一个Employee REST服务,其中Employee类具有以下属性 姓名、年龄、性别、工资、职务、公司id、假期权利、经理姓名和国家

我希望使用Spring4.0编写一个验证层,该验证需要基于员工所在国家/地区进行动态验证

预期验证

  • 员工姓名、年龄、性别和国家是强制性的

  • 员工性别必须为男性或女性

  • 员工年龄不得超过70岁,也不得低于18岁

  • 比如说 如果国家为英国,则假期权利不得超过25天 如果国家为美国,则假期权利不得超过20天 如果国家为西班牙,则假期权利不得超过30天

  • 类似地,如果国家是英国,那么它可以只接受预定义的英国名称列表中的名称,类似的方法适用于其他国家

  • 如果提供了经理的姓名,那么我需要验证他是否与员工属于同一个公司id。因此,我必须查找一些DAO来获取经理的公司ID

  • 问题

    A.鉴于上述验证要求,我想了解Spring中是否有任何特定类允许动态验证,例如基于国家/地区的验证

    B.何时调用验证,立即post my JSON被spring或服务层(类注释@Service)转换为Java对象


    C.我应该在我的员工POJO中仍然使用spring bean validations JSR 303注释,还是应该在另一个类esp中对强制属性进行验证?

    a:据我所知,spring中没有特殊的验证层,javax.validation使用Hibernate作为参考实现。真正容易实现的是方法验证,作为一个例子,您可以看一下

    B:您可以使用@Valid method annotation直接在Controller方法中进行JSR303验证,但我更愿意在您的服务方法中进行验证,这样您就可以更好地控制在验证错误时响应的内容->请参阅

    C:JSR303注释应该足够了,您需要创建自己的验证注释和验证实现,并将其添加到Employee POJO->请参见


    不要忘记为验证编写JUnit测试

    我认为没有一个特殊的验证层100%响应您的需求,但例如,在SpringMVC中,我们有一个验证接口
    org.springFramework.validation.validator

    它使您能够使用validate方法动态定义规则来验证数据,并通过在控制器中创建binder和@Valid来调用它