2010-02-09 12 views
14

Chcę odczytać obiekt domeny (UserVO) z zakresu sesji.Zestaw Spring 3.0 i uzyskaj atrybut sesji

jestem ustawiania uservo w kontrolerze zwanego WelcomeController

@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"; 
    } 
} 

jestem w stanie korzystać z obiektu w jsp stronach <h1>${user.userDetails.firstName}</h1>

Ale nie jestem w stanie odczytać wartość z innego kontrolera,

próbuję odczytać atrybut sesji w następujący sposób:

@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

Jak się masz? Jaki jest dokładny problem – Bozho

+0

Mam teraz ten sam problem. Czy znalazłeś jakieś inne rozwiązanie? –

Odpowiedz

39

Kod, który pokazano powinien być praca - HttpSession jest współużytkowany przez kontrolery i używasz tej samej nazwy atrybutu. Tak więc dzieje się coś złego, że nas nie pokazujesz.

Jednak niezależnie od tego, czy działa, Spring zapewnia bardziej eleganckie podejście do utrzymywania obiektów modelu w sesji przy użyciu adnotacji @SessionAttribute (patrz).

Na przykład (nie testowałem tego, ale to daje wyobrażenie):

@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"; 
    } 
} 

a następnie

@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); 
    } 
} 

Jeśli jednak oryginalny kod nie działa, a następnie to też nie zadziała, ponieważ coś innego jest nie tak z twoją sesją.

+1

Przyszedłem tutaj, szukając pierwszego rozwiązania ('@ SessionAttributes') i wszystko, co otrzymałem, to' java.lang.IllegalStateException: Nie można utworzyć sesji po zatwierdzeniu odpowiedzi ' –

+1

To wydaje się być sprzeczne z tym, co mówi @karpaczio ... Czy ktoś może potwierdzić, co jest poprawne? Sądzę, że atrybuty sesji są udostępniane bez względu na kontroler '@ Controller', ale nie zagłębiłem się w wewnętrzne działanie' @ SessionAttribute'. – Andy

+2

@Andy Zobacz mój komentarz na odpowiedź karpaczio –

6

@SessionAttributes działa tylko w kontekście konkretnego programu obsługi, więc zestaw atrybutów w WelcomeController będzie widoczny tylko w tym kontrolerze.

+5

To, co mówisz, dotyczy wersji Spring <= 3.1.2.RELEASE. Począwszy od 3.1.2.RELEASE, @SessionAttributes są utrzymywane wśród różnych kontrolerów zgodnie z oczekiwaniami –

+1

@Denis Kniazhev zobacz [tutaj] (http://docs.spring.io/spring-framework/docs/3.2.0.M2/api/ org/springframework/web/bind/adnotacja/SessionAttributes.html) Użyj atrybutów sesji dla takich atrybutów konwersacji, które mają być tymczasowo przechowywane w sesji podczas konwersacji określonego programu obsługi. Dla stałych atrybutów sesji, np. obiekt uwierzytelniania użytkownika, zamiast tego użyj tradycyjnej metody session.setAttribute. – lolotron

2

Użyj klasy nadrzędnej, aby dziedziczyć wszystkie kontrolery i używać tam atrybutów SessionAttributes. Wystarczy, że ta klasa powinna znajdować się w skanowaniu pakietu mvc.

0

Być może nie ustawiłeś swojego UserVO jako Serializable.

Powiązane problemy