как spring-mvc находит правильный класс для создания экземпляра и заполнения его данных полями ПОСЛЕ запроса

#java #spring #spring-mvc #data-binding #http-post

#java #spring #spring-mvc #привязка данных #http-post

Вопрос:

прежде всего, я довольно новичок в spring mvc so ..

как springmvc находит правильный класс для создания экземпляра и заполнения его свойств объекта при отправке post-запроса на некоторый контроллер. например, давайте предположим, что у меня есть этот класс

 package springmvc_test.user

public class User {
    private String username;
    private String password;
    public String getUsername() {
        return username;
    }
    public void setUsername(String username) {
        this.username = username;
    }
    public String getPassword() {
        return password;
    }
    public void setPassword(String password) {
        this.password = password;
    }
}
  

и класс контроллера в качестве текущего

 @Controller
@RequestMapping(value = {"/user"} )
public class UserController {
    private List<User> users;

    @Autowired
    public UserController(List<User> users) {
        this.users = users;
    }

    @RequestMapping(value = "/add",method = POST)
    public String addUser(User user,Model m){
        users.add(user);
        //do some other stuf
        //.....
    }

}
  

когда я выполняю пост-запрос для http://localhost/myapp/user/add
наряду с полями формы, которые имеют те же имена, что и User свойства класса,
это работает нормально.

но мой вопрос заключается в том, как springmvc мог найти User класс и создать его экземпляр? хотя User класс вообще не снабжен примечаниями

примечание: я знаю, что spring связывает User свойства объекта, сопоставляя их имена с именами полей формы

Комментарии:

1. Не пропала ли у вас @ModelAttribute аннотация к user параметру, как описано по этой ссылке baeldung.com/spring-mvc-form-tutorial ?

Ответ №1:

Как указано в ссылке на Spring Framework в соответствующем разделе, вы должны использовать либо:

  • @RequestBody если вы хотите, чтобы HttpMessageConverter ваш HTTP-запрос был десериализован на любой Java, то, если вы хотите, чтобы a, ,,, десериализовал ваш HTTP-запрос на любой Java Object
  • @ModelAttribute если вы хотите получить доступ к переменным модели, например, также из вашего HTTP-запроса.

над параметром, который вы хотите связать с данными вашего запроса.