Spring REST输入验证

时间:2016-07-02 19:26:42

标签: spring rest validation spring-mvc bean-validation

我正在使用Spring Boot和JPA编写REST服务。我需要能够验证一些输入字段,并且我希望确保我使用适当的模式。

假设我有以下模型,我也无法控制模型:

{
  "company"   : "ACME"
  "record_id" : "ACME-123"
  "pin"       : "12345"
  "company_name" : ""
  "record_type"  : 0
  "acl"          : ['View','Modify']
  "language"     : "E"
}

我需要做的事情是:

  1. 确保值不为空 - 使用@NotEmpty注释看起来很简单,我可以传递消息。
  2. 确保该值是有效值列表的一部分 - 此处的示例是上述模型中的语言属性。我希望该值为E,F或S.这似乎可以使用自定义注释(例如@ValidValue({" E"," F"," S&#) 34;}))但是有更好的/" Springy"这样做的方法?
  3. 确保列表中的值是有效值列表的一部分 - 此处的示例是acl属性。再次,这似乎可以使用自定义注释,如@ValidListValues({"查看","修改","删除","隐藏"})但与上述问题相同。
  4. 设置默认值 - 根据我的阅读,自定义验证器注释只能验证而不能修改。如果值为null,我想做@DefaultValue(value = 5)之类的事情。这可能吗?更多内容如下。
  5. 将默认值设置为静态方法的返回值 - 例如,如果上面模型中的pin字段未设置,我想将其设置为Util.getRandomDigitsAsString(5)。
  6. 使用其他属性的值 - 我想验证一个属性是否包含来自另一个属性的字符串。使用示例模型,我想确保record_id以company开头。
  7. 我认为这个设置是我认为是控制器的标准方式 - >服务 - > DTO - > DAO - >模型。我想到的另一个选择是在validateCreate()中创建一个方法,该方法将遍历上面的所有项目并在需要时抛出异常。

    感谢。

1 个答案:

答案 0 :(得分:1)

  1. 是的,NotEmpty是正确的方式

  2. 您应该定义Language枚举。 POJO的语言字段应为Language

  3. 类型
  4. 与2.定义Acl枚举

  5. 相同
  6. 在Java代码中定义它。默认情况下,将字段的值初始化为5。如果JSON包含值,Jackson会将字段值设置为JSON中的值。否则,它将保持为5.或者将该字段初始化为null,并添加方法getValueOrDefault(int defaultValue),如果值为null,则返回所需的默认值。

  7. 与4相同

  8. 定义应用于类本身的自定义验证器,而不是类的属性。在验证器中,两个相关值是正确的。