我有一个简单的结构
public class Parent {
@Size(min = 5, max = 10)
String lastName;
List<Child> childs;
}
public class Child {
@Size(min = 5, max = 10)
String firstName;
@Size(min = 1, max = 18)
Integer age;
}
和具有定义的方法
@ResponseBody
@RequestMapping(method = RequestMethod.POST, consumes = "application/json", produces="application/json")
public RestResponse create(@RequestBody Parent object)
这将创建(并提供更新的可能性(父对象。
假设我想创建两个功能:
1(要创建工作副本 - 用户不必正确插入所有数据。
2(向我发送此数据 - 在本例中,如果它们正确,我想有效。
我发现有一种方法可以通过在方法定义中的参数中添加@Valid注释来验证它,如下所示:
@ResponseBody
@RequestMapping(method = RequestMethod.POST, consumes = "application/json", produces="application/json")
public RestResponse create(@RequestBody @Valid Parent object)
但它仅对父字段有效,跳过子字段。我可以在子列表上添加@Valid注释:
public class Parent {
@Size(min = 5, max = 10)
String lastName;
List<Child> childs;
}
但它会一直工作 - 即使我想保存工作副本。是否可以有条件地在父对象内有效对象?
只需将@Valid添加到您的孩子列表中,它应该可以工作
public class Parent {
@Size(min = 5, max = 10)
String lastName;
@Valid
List<Child> childs;
}
您可以使用验证组。在这种情况下,您的模型可能如下所示:
public class Parent {
@Size(min = 5, max = 10, groups = { Draft.class, FinalVersion.class })
String lastName;
@Valid
List<Child> childs;
}
public class Child {
@Size(min = 5, max = 10, groups = FinalVersion.class)
String firstName;
@Range(min = 1, max = 18, groups = FinalVersion.class)
Integer age;
}
另请注意,整数类型不支持@Size
- 您可能希望使用@Range
或一对@Min
@Max
(本质上是一回事(。Draft
和FinalVersion
只是用于定义验证组的简单接口:
interface Draft {
}
interface FinalVersion {
}
然后在控制器中,您需要在 bean 参数上使用@Validated
而不是@Valid
,因为第一个允许您选择验证组。因此,您的控制器将如下所示:
@ResponseBody
@RequestMapping(value = "saveDraft", method = RequestMethod.POST, consumes = "application/json", produces = "application/json")
public RestResponse create(@RequestBody @Validated(Draft.class) Parent object) {
// your stiff here
}
@ResponseBody
@RequestMapping(value = "submitFinal", method = RequestMethod.POST, consumes = "application/json", produces = "application/json")
public RestResponse create(@RequestBody @Validated(FinalVersion.class) Parent object) {
// your stiff here
}
但是您需要有两种方法来处理帖子 - 一种用于草稿,一种用于最终提交。
我会添加@Valid
并始终对其进行验证。如果您不关心有效的子项,则可以将BindingResult bindingResult
添加到控制器方法中,以防止默认验证和忽略无效子项的错误列表。
使用bindingResult.hasFieldErrors(fieldName)
方法。
或者,您可以再创建一个 ParentExt 扩展父级,并在 getter 上而不是在字段上添加@Valid
。
嗯...这可以通过椭圆形验证框架来实现。它看起来是一样的,但给你更多的功能。
http://oval.sourceforge.net/userguide.html#declaring-conditional-constraints
@AssertValid(when="something!=null"( - 类似的东西
如果不是,那么在某些情况下,您应该使用标准验证器类。