我提交此数据以通过Ajax(POST)添加子实体:
(请参阅本问题的底部了解实体类定义)
name = "Child Name"
parent.id = 3
一切都好。新的Child实体已成功保存。
但如果不包含parent.id
(仅设置name
)(使用POST方法提交)
name = "Child Name"
验证结果返回此JSON:
"errors":{"parent":"may not be null"}
请注意该JSON中的"parent"
属性。它应该返回parent.id
而不是parent
。
由于客户端脚本(HTML)上的字段名称为"parent.id"
而不是"parent"
,因此会导致问题。
任何建议如何返回parent.id
而不是parent
??
这是处理程序方法:
@RequestMapping(value = "/add", method = RequestMethod.POST)
@ResponseBody
public Map<String, ?> add(@Valid Child child, BindingResult result) {
Map<String, ?> out = new LinkedHashMap<String, ?>();
if(result.hasErrors()){
Map<String, String> errors = new LinkedHashMap<String, String>();
for (FieldError error : result.getFieldErrors()) {
errors.put(error.getField(), error.getDefaultMessage());
}
out.put("success", false);
out.put("errors", errors);
return out;
} else {
out.put("success", true);
}
return out;
}
以下是实体类:
class Child {
private int id;
@NotNull
@Size(min = 5)
private String name;
@NotNull
private Parent parent;
//getter and setter methods
}
class Parent {
private int id;
@NotNull
private String name;
//getter and setter methods
}
谢谢。
答案 0 :(得分:2)
感谢@oehmiche的建议。
我最终将实体类更改为:
class Child {
@NotNull
private int id;
@NotNull
@Size(min = 5)
private String name;
@NotNull
@Valid
private Parent parent = new Parent("Foo Foo");
//getter and setter methods
}
class Parent {
@NotNull
private int id;
@NotNull
private String name;
public Parent(){
}
public Parent(String name){
setName(name);
}
//getter and setter methods
}
这是提交的数据:
id = 1
name = "Child Name"
parent.id = 3
请注意id
属性。我最终总是将其设置为1只是为了绕过@NotNull
约束。虽然id
值总是被Hibernate取代(我使用自动生成策略)。
(我为Parent的@NotNull
添加id
约束以及Child类以保持一致性)
然而,仍有一个问题。我必须始终设置父名称,以绕过Parent的name
属性的验证约束:
@NotNull
@Valid
private Parent parent = new Parent("Foo Foo");
对此有何建议?
答案 1 :(得分:1)
根据hiberante验证规范,对象图验证是使用要验证的属性上的@Valid
触发的(在您的情况下是parent
属性)。但也有人提到null
值会被忽略(请参阅example下面的注释)。
因此,在您的情况下,我建议您在Parent
类中实例化一个空的Child
对象,并使用@Valid
注释该对象:
@Valid
private Parent parent = new Parent();