2011-02-23 4 views
3

일부 세션 범위가 있습니다. 첫 번째 아이디어는 세션 스코프 된 서블릿이었다. 그래서 나는이guice를 사용하는 세션 상태

bind(Foo.class).in(ServletScopes.SESSION); 

처럼 내 서블릿을 결합하지만 예외를

javax.servlet.ServletException를 얻을 : 서블릿이 싱글로 바인딩해야합니다. Key [type = Foo, annotation = [none]]는 싱글 톤 범위에서 바인딩되지 않았습니다.

그래서 서블릿은 ServletScopes의 범위를 가질 수 없습니까? 세션 상태를 처리하는 올바른 방법은 무엇입니까 (예, 물론 더 적은 서블릿/클래스/응용 프로그램을 작성하는 것이 낫습니다).

답변

3

당신이 세션에 결합을 할 수 어떤 국적을 상실한다 범위에 문제가있는 경우 FooServlet의 서브 클래스로 보이고 서블릿은 Singleton 범위에 바인딩되어야합니다.

은 당신의 상태 (Bar라고) 세션의 범위를 결합하고 Foo 생성자에게 (Guice에 의해 채워집니다)을 Provider<Bar> 인수를주고,이 문제를 해결하려면, 그래서 당신은 싱글에서 세션 범위 상태에 액세스 할 수 있습니다 -scoped Foo 서블릿.

+0

고마워요. 그것은 내가 필요한 것입니다. –

2

서블릿은 Guice가 아니라 서블릿 컨테이너에서 생성됩니다. 그리고 그들은 싱글 톤입니다. 서블릿 컨테이너는 모든 클라이언트의 모든 요청을 처리하기 위해 하나의 인스턴스 만 생성합니다.

그래서 세션 범위에 바인딩하는 것은 의미가 없습니다. Guice는 세션 당 하나의 다른 서블릿 인스턴스를 만들 수 없습니다.

서블릿은 항상 (즉, 상태가 모든 클라이언트에 글로벌해야하고, 스레드 안전한 방법으로 액세스 할 수)에 대한 이해에서

+0

확인. 감사. 그러나 ServletScopes가 어떤 목적으로 생성 되었습니까? 그리고 세션 범위 변수를 어디에 두어야합니까? –

+1

Guice는 실제로 guice-servlet 확장을 사용할 때 서블릿을 만듭니다. 서블릿은 서블릿 스펙과 일치하기 때문에 싱글 톤이어야합니다. – ColinD