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"
}
我需要做的事情是:
- 确保该值不为空 - 使用 @NotEmpty 注释这看起来很简单,我可以传递消息。
- 确保该值是有效值列表的一部分 - 此处的示例是上述模型中的语言 属性。我希望该值是 E、F 或 S。这似乎可以使用自定义注释(例如 @ValidValue({"E","F","S"}))但是是否有更好的/"Springy" 方法来做到这一点?
- 确保列表中的值是有效值列表的一部分 - 这里的示例是 acl 属性。同样,这似乎可以通过 @ValidListValues({"View", "Modify", "Delete", "Hide"}) 这样的自定义注释来实现,但与上面的问题相同。
- 设置默认值 - 据我了解,自定义验证器注释只能验证而不能修改。如果值为 null,我想做类似 @DefaultValue(value=5) 的事情。这可能吗?更多内容请见下文。
- 将默认值设置为静态方法的 return - 例如,如果未设置上述模型中的 pin 字段,我想将其设置为类似 Util.getRandomDigitsAsString(5 ).
- 使用另一个 属性 的值 - 我想验证一个 属性 是否包含另一个 属性 的字符串。使用示例模型,我想确保 record_id 以 company.
开头
我以我认为是控制器 -> 服务 -> DTO -> DAO -> 模型的标准方式进行了此设置。我考虑的另一个选择是在 validateCreate() 中创建一个方法,该方法将遍历上述所有项目并在需要时抛出异常。
谢谢。
是的,NotEmpty是正确的方法
您应该定义一个 Language
枚举。 POJO 的语言字段应该是 Language
类型
与 2 相同。定义一个 Acl
枚举。
在您的 Java 代码中定义。默认情况下将字段的值初始化为 5。如果 JSON 包含一个值,Jackson 会将字段值设置为 JSON 中的值。否则,它将保持为5。或者将字段初始化为null,并添加一个方法getValueOrDefault(int defaultValue)
,如果值为null,则returns您想要的默认值。
同4
定义一个应用于 class 本身的自定义验证器,而不是 class 的 属性。在验证器中检查两个相关值是否正确。
我正在使用 Spring Boot 和 JPA 编写 REST 服务。我需要能够验证某些输入字段,并且我想确保我使用的是正确的模式。
假设我有以下模型并且我也无法控制该模型:
{
"company" : "ACME"
"record_id" : "ACME-123"
"pin" : "12345"
"company_name" : ""
"record_type" : 0
"acl" : ['View','Modify']
"language" : "E"
}
我需要做的事情是:
- 确保该值不为空 - 使用 @NotEmpty 注释这看起来很简单,我可以传递消息。
- 确保该值是有效值列表的一部分 - 此处的示例是上述模型中的语言 属性。我希望该值是 E、F 或 S。这似乎可以使用自定义注释(例如 @ValidValue({"E","F","S"}))但是是否有更好的/"Springy" 方法来做到这一点?
- 确保列表中的值是有效值列表的一部分 - 这里的示例是 acl 属性。同样,这似乎可以通过 @ValidListValues({"View", "Modify", "Delete", "Hide"}) 这样的自定义注释来实现,但与上面的问题相同。
- 设置默认值 - 据我了解,自定义验证器注释只能验证而不能修改。如果值为 null,我想做类似 @DefaultValue(value=5) 的事情。这可能吗?更多内容请见下文。
- 将默认值设置为静态方法的 return - 例如,如果未设置上述模型中的 pin 字段,我想将其设置为类似 Util.getRandomDigitsAsString(5 ).
- 使用另一个 属性 的值 - 我想验证一个 属性 是否包含另一个 属性 的字符串。使用示例模型,我想确保 record_id 以 company. 开头
我以我认为是控制器 -> 服务 -> DTO -> DAO -> 模型的标准方式进行了此设置。我考虑的另一个选择是在 validateCreate() 中创建一个方法,该方法将遍历上述所有项目并在需要时抛出异常。
谢谢。
是的,NotEmpty是正确的方法
您应该定义一个
Language
枚举。 POJO 的语言字段应该是 Language 类型
与 2 相同。定义一个
Acl
枚举。在您的 Java 代码中定义。默认情况下将字段的值初始化为 5。如果 JSON 包含一个值,Jackson 会将字段值设置为 JSON 中的值。否则,它将保持为5。或者将字段初始化为null,并添加一个方法
getValueOrDefault(int defaultValue)
,如果值为null,则returns您想要的默认值。同4
定义一个应用于 class 本身的自定义验证器,而不是 class 的 属性。在验证器中检查两个相关值是否正确。