복붙노트

[SPRING] 메소드의 @ModelAttribute

SPRING

메소드의 @ModelAttribute

다음과 같은 코드를 상상해보십시오.

@RequestMapping(value="/users", method=RequestMethod.GET)
public String list(Model model) {
    ...
}

@InitBinder("user")
public void initBinder(WebDataBinder binder) {
    binder.setDisallowedFields("password"); // Don't allow user to override the value
}

@ModelAttribute("user")
public User prepareUser(@RequestParam("username") String username){
    ...
}

@RequestMapping(value="/user/save", method=RequestMethod.POST)
public String save(@ModelAttribute("user") User user, Model model) {        
    ...
}

필자는 필드를 바인드 할 수 없도록하기 위해 init 바인더를 사용하고 바인드되기 전에 @ModelAttribute로 메소드 (prepareUser ())를 표시하여 사용자 객체를 준비합니다. 그래서 / user / save를 호출하면 initBinder ()와 prepareUser ()가 실행됩니다.

Spring MVC가 @ModelAttribute ( "user")로 메소드를 실행하기 전에이 메소드를 적용해야한다는 것을 이해할 수 있도록 @InitBinder와 @ModelAttribute에서 "user"를 설정했습니다.

문제는 @ModelAttribute ( "user")로 주석 된 메소드가이 컨트롤러의 모든 매핑 된 메소드보다 먼저 실행된다는 것입니다. 예를 들어, / user를 호출하면 prepareUser는 list () 메소드보다 먼저 실행됩니다. 어떻게이 preparer은 같은 컨트롤러에 모든 메소드를 가지고있는 save () 메소드 전에 만 실행될 수 있습니까?

감사

해결법

  1. ==============================

    1.그것은 실제로 @ModelAttribute가 필요한 것이 아닙니다. 메서드 매개 변수로 사용하면 주석이 달린 매개 변수가 모델에 저장됩니다 (괜찮습니다). 메서드에 넣으면 컨트롤러의 모든 메서드에 액세스해야하는 참조 데이터를 제공 할 때마다 호출됩니다.

    그것은 실제로 @ModelAttribute가 필요한 것이 아닙니다. 메서드 매개 변수로 사용하면 주석이 달린 매개 변수가 모델에 저장됩니다 (괜찮습니다). 메서드에 넣으면 컨트롤러의 모든 메서드에 액세스해야하는 참조 데이터를 제공 할 때마다 호출됩니다.

    User 객체 구축을 제어하려면 몇 가지 옵션이 있습니다. 나에게 가장 명백한 두 가지는 다음과 같습니다.

  2. from https://stackoverflow.com/questions/4335432/modelattribute-in-a-method by cc-by-sa and MIT license