Spring MVC: как получить поле ошибки BindingResult для вложенного объекта - PullRequest
0 голосов
/ 27 января 2012

Я отправляю эти данные для добавления дочерней сущности через Ajax (POST):

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

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
}

Спасибо.

Ответы [ 2 ]

2 голосов
/ 30 января 2012

Спасибо за @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 класса Parent, а также дочерний класс для согласованности)

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

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

Есть предложения для этого?

1 голос
/ 27 января 2012

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

@Valid        
private Parent parent = new Parent();

см. Также https://stackoverflow.com/a/5142960/160729

...