2010-02-09 8 views
14

세션 범위에서 도메인 객체 (UserVO)를 읽으 려합니다.스프링 3.0이 세션 속성을 설정하고 가져옵니다.

내가 WelcomeController라는 컨트롤러에 UserVO을 설정하고

@Controller 
@RequestMapping("/welcome.htm") 
public class WelcomeController { 
@RequestMapping(method = RequestMethod.POST) 
    public String processSubmit(BindingResult result, SessionStatus status,HttpSession session){ 
     User user = loginService.loginUser(loginCredentials); 
    session.setAttribute("user", user); 
     return "loginSuccess"; 
    } 
} 

내가 JSP 페이지

<h1>${user.userDetails.firstName}</h1>의 개체를 사용할 수 있어요하지만,

다른 컨트롤러에서 값을 읽을 수 아니다 다음과 같이

나는 세션 속성을 읽기 위해 노력하고 있어요 :

@Controller 
public class InspectionTypeController { 
@RequestMapping(value="/addInspectionType.htm", method = RequestMethod.POST) 
public String addInspectionType(InspectionType inspectionType, HttpSession session) 
{ 
      User user = (User) session.getAttribute("user"); 
      System.out.println("User: "+ user.getUserDetails().getFirstName); 

     } 
} 
+0

어떻게 할 수 있습니까? 정확한 문제는 무엇입니까 – Bozho

+0

나는 지금 당신에게 같은 문제가 있습니다. 다른 해결책을 찾았습니까? –

답변

39

표시된 코드 이어야합니다. HttpSession은 컨트롤러간에 공유되며 동일한 속성 이름을 사용하고 있습니다. 따라서 뭔가 다른 것이 잘못되어 가고 있습니다.

그러나 작동하는지 여부에 관계없이 Spring은 @SessionAttribute 주석 (docs 참조)을 사용하여 세션에서 모델 객체를 유지하는보다 우아한 방법을 제공합니다. 예를 들어

(I이 테스트를하지 않은,하지만 그것은 당신에게 아이디어 제공) : 원래의 코드가 작동하지 않는 경우 다음, 그러나

@Controller 
@RequestMapping("/welcome.htm") 
@SessionAttributes({"user"}) 
public class WelcomeController { 
    @RequestMapping(method = RequestMethod.POST) 
    public String processSubmit(ModelMap modelMap){ 
     User user = loginService.loginUser(loginCredentials); 
     modelMap.addtAttribute(user); 
     return "loginSuccess"; 
    } 
} 

다음

@Controller 
@SessionAttributes({"user"}) 
public class InspectionTypeController { 

    @RequestMapping(value="/addInspectionType.htm", method = RequestMethod.POST) 
    public void addInspectionType(InspectionType inspectionType, @ModelAttribute User user) { 
     System.out.println("User: "+ user.getUserDetails().getFirstName); 
    } 
} 

을 세션에서 다른 것이 잘못 되었기 때문에이 방법도 작동하지 않습니다.

+1

첫 번째 해결책 ('@ SessionAttributes')을 찾기 위해 여기에 왔는데'java.lang.IllegalStateException : 응답이 커밋 된 후에 세션을 만들 수 없습니다 ' –

+1

이것은 @karpaczio가 말하는 것과 모순되는 것 같습니다 ... 누군가가 올바른지 확인할 수 있습니까? 나는 세션 속성이 문제의'@ Controller'에 관계없이 공유된다고 생각 하겠지만,'@ SessionAttribute'의 내부 동작을 조사하지 않았습니다. – Andy

+2

@Andy karpaczio 님의 답변에 대한 나의 덧글보기 –

6

@SessionAttributes는 특정 처리기의 컨텍스트에서만 작동하므로 WelcomeController의 특성 집합은이 컨트롤러에서만 볼 수 있습니다.

+5

당신이 말하는 것은 스프링 버전 <= 3.1.2.RELEASE의 경우입니다. 3.1.2.RELEASE부터 @SessionAttributes는 다른 컨트롤러간에 예상대로 유지됩니다. –

+1

@Denis Kniazhev [http://docs.spring.io/spring-framework/docs/3.2.0.M2/api/]를 참조하십시오. org/springframework/web/bind/annotation/SessionAttributes.html) 특정 처리기의 대화 과정에서 세션에 임시로 저장되는 대화식 특성에 대해 SessionAttributes를 사용합니다. 영구 세션 속성의 경우 대신 사용자 인증 객체는 전통적인 session.setAttribute 메소드를 사용하십시오. – lolotron

2

상위 클래스를 사용하여 모든 컨트롤러를 상속하고 그 위에 SessionAttributes를 사용하십시오. 이 클래스는 mvc의 패키지 스캔에 있어야합니다.

0

UserVO를 Serializable로 설정하지 않았습니까?

관련 문제