javax.validation.valid on child objects



我有一个简单的结构

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(本质上是一回事(。DraftFinalVersion只是用于定义验证组的简单接口:

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"( - 类似的东西

如果不是,那么在某些情况下,您应该使用标准验证器类。

相关内容

最新更新