2010-12-02 2 views
6

이 같은 코드를 상상해 바인딩되기 전에 내 User 객체. 그래서/user/save를 호출하면 initBinder()와 prepareUser()가 실행됩니다.@ModelAttribute

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

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

감사

+0

'prepareUser'는 실제로 무엇을합니까? – skaffman

+0

@skaffman @skaffman 사용자 이름 param을 가져 와서 데이터베이스에서 User 객체를로드하므로 바인드 할 수없는 모든 데이터 (예 : password)는 바인딩 후 유지 될 때 null 값으로 덮어 쓰지 않습니다. – Javi

답변

7

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

사용자 개체 구축을 제어하려면 몇 가지 옵션이 있습니다. 나에게 가장 분명 두 사람은 다음과 같습니다

  1. 는 사용자 개체에 문자열 사용자 이름을 변환 할 conversion service in Spring 3를 사용하여, 사용자 객체를 구축하기위한 새로운 사용자 정의 편집기 (A의 PropertyEditor 클래스)를 추가 할 InitBinder 방법을 사용합니다.
+0

OK initbinder에서 속성 편집기를 사용하지만, @ModelAttribute 주석을 사용하여 메소드의 실제 목적이 무엇인지 이해하지 못합니다. 일반적인 사용 예를 들어 주시겠습니까? 또한 모든 메소드보다 먼저 실행되는 경우 왜 주석이 주석의 값으로 주어진 문자열 (예 : @ModelAttribute ("user")의 "user")이 될 수 있습니까? – Javi

+1

@ Javi 좋은 질문입니다. 우선 initbinder에서해야한다고 생각하지 않습니다. 단지 가능합니다. 필자는보다 현대적인 전환 서비스 방식을 선호합니다. @ModelAttribute로 주석 된 메소드의 일반적인 사용은 컨트롤러의 모든 메소드에 필요한 참조 데이터입니다. 예를 들어 Pet Store를 사용하려면 컨트롤러에 애완 동물을 나열하고 개별 애완 동물을 보는 방법이 있지만 범주 메뉴 ("Rabbits", "Dogs"등)에 대한 정보가 필요합니다. 각 방법에서이 작업을 반복하지 않아도됩니다. – GaryF

+2

@ Javi 왜 이름을 붙일 수 있느냐에 따라 Spring은 반환 된 객체를 그 이름으로 모델에 넣을 수 있습니다. 스프링 매뉴얼의 예는 다음과 같습니다. http://static.springsource.org/spring/docs/3.0.x/spring-framework-reference/html/mvc.html#mvc-ann-modelattrib – GaryF

관련 문제