2012-01-27 4 views
0

я представить эти данные, чтобы добавить дочерний объект с помощью Ajax (POST):Spring MVC: Как получить BindingResult поля ошибки для вложенного объекта

(см в нижней части этого вопроса для определения классов сущностей)

name = "Child Name" 
parent.id = 3 

Все в порядке. Новый дочерний объект успешно сохранен.

Но если не включать parent.id (только name установлен) (представляемая с помощью метода POST)

name = "Child Name" 

Результат проверки возвращают этот JSON:

"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 родителя, а также класс Child совместности)

Однако, есть еще одна проблема. Я всегда устанавливать имя родителя просто обойти ограничение проверки для name свойство Parent:

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

Любое предложение для этого?

+0

Используйте @Validated аннотацию в контроллере с «группой проверки» http://beanvalidation.org/1.0/spec/#validationapi-validatorapi-groups –

1

В соответствии с критерием проверки достоверности объекта Hiberante с использованием @Valid объекта, подлежащего проверке (в вашем случае это свойство parent). Но также упоминается, что значения null будут проигнорированы (см. Примечание ниже example). Так что в вашем случае я хотел бы предложить, чтобы создать экземпляр пустой Parent объект в вашем Child класса и аннотировать, что один с @Valid:

@Valid   
private Parent parent = new Parent(); 

смотри также https://stackoverflow.com/a/5142960/160729

+0

Спасибо @oehmiche. Я думаю, ваше решение правильно. Но теперь он проверяет null «parent.name» вместо нулевого «parent.id». Любое дальнейшее предложение для этого? –

Смежные вопросы