Spring MVC:如何获取嵌套对象的BindingResult错误字段

时间:2012-01-27 04:03:13

标签: json validation data-binding spring-mvc

我提交此数据以通过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
}

谢谢。

2 个答案:

答案 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();

另见https://stackoverflow.com/a/5142960/160729