Spring REST 输入验证

Spring REST input 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"}))但是是否有更好的/"Springy" 方法来做到这一点?
  3. 确保列表中的值是有效值列表的一部分 - 这里的示例是 acl 属性。同样,这似乎可以通过 @ValidListValues({"View", "Modify", "Delete", "Hide"}) 这样的自定义注释来实现,但与上面的问题相同。
  4. 设置默认值 - 据我了解,自定义验证器注释只能验证而不能修改。如果值为 null,我想做类似 @DefaultValue(value=5) 的事情。这可能吗?更多内容请见下文。
  5. 将默认值设置为静态方法的 return - 例如,如果未设置上述模型中的 pin 字段,我想将其设置为类似 Util.getRandomDigitsAsString(5 ).
  6. 使用另一个 属性 的值 - 我想验证一个 属性 是否包含另一个 属性 的字符串。使用示例模型,我想确保 record_id 以 company.
  7. 开头

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

谢谢。

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

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

  3. 类型
  4. 与 2 相同。定义一个 Acl 枚举。

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

  6. 同4

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