복붙노트

[SPRING] 스프링 MVC : @SessionAttributes는 컨트롤러간에 공유됩니까?

SPRING

스프링 MVC : @SessionAttributes는 컨트롤러간에 공유됩니까?

검색 및 결과 목록에 대한 추상 컨트롤러 지원 클래스가 있습니다.

@Controller
@SessionAttributes("query")
public abstract class SearchController<Q extends SearchQuery> {
    @RequestMapping
    public String performSearch(@ModelAttribute("query") Q query) {
        ....
    }

    @ModelAttribute("query")
    public abstract Q createDefaultSearchQuery();
}

여러 실제 검색 컨트롤러가이 기본 클래스를 확장합니다.

컨트롤러 중 하나에 액세스 한 후 (BookSearchQuery를 사용하는 /searchBooks.html이 SearchQuery를 구현한다고 말함) 쿼리가 세션에 올바르게 저장되고 후속 요청에 사용할 수 있습니다.

그러나 다른 컨트롤러 (예 : /searchAuthors.html에서 SearchQuery를 구현하는 /searchAuthors.html)에 액세스하면 마지막 요청 (BookSearchQuery)의 쿼리가 나중에 ClassCastException을 발생시키는 새 컨트롤러에 계속 사용되고 있습니다.

@SessionAttribute 주석을 지원 클래스에서 구현 클래스로 옮겨 보려고했지만 아무 소용이 없습니다.

내가 잘못하고있는 것이나 디자인에 의한 것입니까? 내가 무엇을 할 수 있을지?

고마워요!

해결법

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

    1.@SessionAttributes를 사용하면이 객체는 같은 이름으로 HttpSession에 저장되며 다른 컨트롤러에서 액세스 (공유)됩니다. 그래서 스프링이 올바르게 작동합니다.

    @SessionAttributes를 사용하면이 객체는 같은 이름으로 HttpSession에 저장되며 다른 컨트롤러에서 액세스 (공유)됩니다. 그래서 스프링이 올바르게 작동합니다.

    모든 시나리오 ( "BookQuery", "AutorQuery", ...)에서이 속성의 이름을 바꾸는 것이 가장 좋은 방법이라고 생각합니다. 매우 우아하지 않습니다. (

  2. ==============================

    2.나는 Spring 3.0.2에서 이것을 시도했지만 세션 속성은 컨트롤러간에 공유되지 않는다. 사실 나는 반대의 효과를 찾고 있었고 그것이 내가 발견 한 방법입니다.

    나는 Spring 3.0.2에서 이것을 시도했지만 세션 속성은 컨트롤러간에 공유되지 않는다. 사실 나는 반대의 효과를 찾고 있었고 그것이 내가 발견 한 방법입니다.

  3. from https://stackoverflow.com/questions/4016532/spring-mvc-sessionattributes-shared-among-controllers by cc-by-sa and MIT license