Почему использование @Valid с @ModelAttribute приводит к исключению? - PullRequest
0 голосов
/ 21 декабря 2018

Я получаю "Ни BindingResult, ни простой целевой объект для имени бина" person1 ", доступный как атрибут запроса" .Большинство ответов на эту проблему говорят о том, что мне не хватает аннотации @ ModelAttribute , но я использую ее и все еще получаю это исключение.

Я использую несколько методов контроллера и хочу, чтобы одна и та же модель имела разные имена в разных методах.Проблема возникает, когда я использую @ ModelAttribute (name = "person1") .Если я не назову его, он работает, но у меня одна и та же модель во всех формах, и я получаю одинаковые ошибки проверки во всех формах, даже если я заполняю только одну.

Это мои примеры методов контроллера:

@RequestMapping(value = "/index", method = RequestMethod.GET)
public ModelAndView index(HttpSession session) {
logger.info("opening index page");
ModelAndView modelAndView = new ModelAndView();
modelAndView.addObject("person1", new Person("Maria Smith", null));
modelAndView.addObject("person", new Person("John Doe", null));
return modelAndView;
}

@RequestMapping(value = "/getPersonTree", method = RequestMethod.POST)
public ModelAndView getPersonTree(@Valid @ModelAttribute("person1") Person person, BindingResult bindingResult) {
    if (bindingResult.hasErrors()) {
        return new ModelAndView("index", "person1", person);
    } else {
        int id = databaseModel.getPersonID(person);
        person = databaseModel.setPersonTreeParents(databaseModel.getPersonTree(id));
        ModelAndView modelAndView = new ModelAndView();
        modelAndView.setViewName("getPersonTreeSuccess");
        modelAndView.addObject("person1", person);
        return modelAndView;
    }
}    }

@RequestMapping(value = "/insertPerson", method = RequestMethod.POST)
public ModelAndView insertPerson(@Valid @ModelAttribute Person person, 
BindingResult bindingResult) {
logger.info("insert person controller");
if (bindingResult.hasErrors()) {
    return new ModelAndView("index", "person", person);
} else {
    databaseModel.insert(person);
    ModelAndView modelAndView = new ModelAndView();
    modelAndView.setViewName("insertSuccess");
    modelAndView.addObject("person", person);
    return modelAndView;
}
}

Это мои примеры jsps:

<f:form class="form-inline" action="getPersonTree"
modelAttribute="person1">

<f:label path="name">Person Name:</f:label>
<f:input path="name" type="text" />
<f:errors path="name" class="alert alert-danger"></f:errors>
<button class="btn btn-primary" type="submit">Get Person
    Tree</button>

</f:form>

<f:form class="form-inline" action="insertPerson"
modelAttribute="person">

<f:label path="name">Person Name:</f:label>
<f:input path="name" type="text" />
<f:errors path="name" class="alert alert-danger"></f:errors>


<f:label path="birthDate">Date of birth:</f:label>
<f:input type="date" path="birthDate" />
<f:errors path="birthDate" class="alert alert-danger"></f:errors>


<f:label path="gender">Gender:</f:label>
<%--                        <f:input path="gender" type="text" /> --%>
<f:radiobutton path="gender" value="male" />M
<f:radiobutton path="gender" value="female" />F
<f:errors path="gender" class="alert alert-danger"></f:errors>

<button class="btn btn-primary" type="submit">Add Person</button>

</f:form>

Я ожидал, что пользовательские имена будут работать, потому что есть учебники, показывающиетакие примеры с нестандартными именами, но я получаю исключение.Итак, мой вопрос: может ли кто-нибудь показать правильный способ работы с несколькими ModelAttributes на одной странице с несколькими формами, по одному ModelAttribute на форму, но с разными именами?

1 Ответ

0 голосов
/ 21 декабря 2018

В GET обработчик:

modelAndView.addObject("thisIsYourCommandName", person);

В JSP:

<form modelAttribute="thisIsYourCommandName" ..../>

В POST обработчик:

@RequestMapping(value = "/getPersonTree")
public ModelAndView getPersonTree(@ModelAttribute("thisIsYourCommandName") Person person, BindingResult result) {
    // ...
}

Если имя вашей команды"person" вместо "thisIsYourCommandName", вы можете сделать это

@ModelAttribute Person person

, что совпадает с

@ModelAttribute("person") Person person

Так что просто сделайте что-то вроде этого:

GET обработчик:

modelAndView.addObject("person", new Person());
modelAndView.addObject("x", new Person());

форма для Person:

<form:form modelAttribute="person" ...>

форма для X:

<form:form modelAttribute="x" ...>

POST обработчик:

@ModelAttribute("person") Person person или @ModelAttribute Person person

А:

@ModelAttribute("x") Person person или @ModelAttribute Person x

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...