2012-01-27 505 views
0

我提交此数据通过Ajax(POST)添加Child实体:Spring MVC的:如何获取BindingResult错误域的嵌套对象

(见这个问题对实体类定义的底部)

name = "Child Name" 
parent.id = 3 

一切都好。新的子实体已成功保存。

但如果不包括parent.id(仅name设置)

name = "Child Name" 

验证结果返回该JSON(使用POST方法提交):

"errors":{"parent":"may not be null"} 

注意"parent"财产那个JSON。它应该返回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 
} 

谢谢。

回答

1

感谢@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取代(我使用自动生成策略)。

(我加@NotNull约束的家长id以及儿童类一致性)

然而,仍然有一个问题。我不得不总是设置父母的名字只是为了绕过验证约束的家长name属性:

@NotNull 
@Valid 
private Parent parent = new Parent("Foo Foo"); 

这什么建议吗?

+0

在控制器中使用带有“验证组”的@Validated注释http://beanvalidation.org/1.0/spec/#validationapi-validatorapi-groups – 2013-03-19 16:24:57

1

根据hiberante验证规范对象图验证是使用属性上的@Valid来验证的(在您的情况下为parent属性)。但也有人提到null的值将被忽略(请参阅下面的注释example)。 所以你的情况我建议实例在Child类空Parent对象和注释是一个与@Valid

@Valid   
private Parent parent = new Parent(); 

也看到https://stackoverflow.com/a/5142960/160729

+0

谢谢@oehmiche。我认为你的解决方案是正确的。但现在它验证了null parent.name而不是null parent.id。任何进一步的建议? – 2012-01-29 21:13:15