【问题标题】:Spring REST input validationSpring REST 输入验证
【发布时间】:2016-07-02 19:26:41
【问题描述】:

我正在使用 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"}))但是有更好/“弹性”的方式这样做?
  3. 确保列表中的值是有效值列表的一部分 - 这里的示例是 acl 属性。同样,这似乎可以使用 @ValidListValues({"View", "Modify", "Delete", "Hide"}) 之类的自定义注释,但问题与上述相同。
  4. 设置默认值 - 根据我的阅读,自定义验证器注释只能验证而不能修改。如果值为空,我想做类似@DefaultValue(value=5) 的事情。这可能吗?详情请参阅下文。
  5. 为静态方法的返回设置默认值 - 例如,如果上面模型中的 pin 字段未设置,我想将其设置为 Util.getRandomDigitsAsString(5) 之类的内容。
  6. 使用来自另一个属性的值 - 我想验证一个属性是否包含来自另一个属性的字符串。使用示例模型,我想确保 record_id 以公司开头。

我认为这种设置是控制器 -> 服务 -> DTO -> DAO -> 模型的标准方式。我正在考虑的另一个选择是在 validateCreate() 中创建一个方法,该方法将遍历上述所有项目并在需要时抛出异常。

谢谢。

【问题讨论】:

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


    【解决方案1】:
    1. 是的,NotEmpty 是正确的方法

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

    3. 同2。定义Acl枚举。

    4. 在您的 Java 代码中定义它。默认将字段的值初始化为5。如果 JSON 包含值,Jackson 会将字段值设置为 JSON 中的值。否则,它会保持为 5。或者将字段初始化为 null,并添加一个方法getValueOrDefault(int defaultValue),如果值为 null,则返回您想要的默认值。

    5. 同4

    6. 定义一个适用于类本身的自定义验证器,而不是类的属性。在验证器中检查两个相关值是否正确。

    【讨论】:

    • 谢谢。我会试一试所有这些。这些应该在 DTO 还是模型中完成?
    猜你喜欢
    • 1970-01-01
    • 2015-01-03
    • 1970-01-01
    • 2016-03-02
    • 2014-08-10
    • 1970-01-01
    • 2011-04-08
    • 2016-05-21
    • 1970-01-01
    相关资源
    最近更新 更多