2012-10-30 1 views
2

것이 아닙니다. 나는 최근에 다른 하나를 추가했다 - 그것은 get과 post 메소드를 가지고있다. 여기에 몇 가지 이유로 나에게guice 서블릿 내가 내 프로젝트에서이 서블릿을 <p></p>을 일어나고있는 끔찍한 싱글

을 받고 무슨 일이야 - - 여기

이제 2 서블릿 코드

@Singleton 
@WebServlet("/Medical_Web") 
public class XXXDetailsServlet extends HttpServlet { 

    private static final long serialVersionUID = 1L; 

    @Inject 
    private Provider<XXXPersistenceManager> persistenceManager; 

    @Inject 
    private Provider<XXXChain> chainProvider; 

    @Override 
    protected void doGet(HttpServletRequest request, HttpServletResponse response) 
     throws ServletException, IOException { 
     System.out.println("servlet address = " + this); 
     final String xxx= request.getParameter("xxx"); 
     String json = ""; 
     try { 
      final XXXBean xxxBean = persistenceManager.get().find(xxx); 
      json = new GsonBuilder().create().toJson(xxxBean); 
     } catch (Exception ex) { 
      ex.printStackTrace(); 
     } 
     request.setAttribute("json", json.trim()); 
     getServletContext().getRequestDispatcher("/XXX.jsp").forward(request, response); 
    } 

    @Override 
    protected void doPost(HttpServletRequest request, HttpServletResponse response) 
     throws ServletException, IOException { 
     System.out.println("servlet address = " + this); 
     final String xxx = request.getParameter("xxx"); 
     try { 
      final XXXChain chain = chainProvider.get(); 
      chain.getContext().setAttribute(XXX_TYPE, XXXType.DELETE); 
      final XXXBean xxxBean = persistenceManager.get().find(xxx); 
      final List<XXXBean> xxxList = new ArrayList<XXXBean>(); 
      xxxList.add(xxxBean); 
      chain.process(xxxList); 
     } catch (Exception ex) { 
      ex.printStackTrace(); 
     } 
    } 
} 

인이이 @Singleton로 표시하더라도 - 서블릿 주소는 분명히 서로 다른 돌아오고있다 . 내가 처음 게시물 메서드에서 null 포인터를 때이 나타났습니다 - 내가 get 메소드를 호출 할 때마다 서블릿의 인스턴스는 모든 필드가 채워져 돌아옵니다. post 메서드를 호출 할 때마다 서블릿의 인스턴스는 다시 가져옵니다 (다른 인스턴스) 필드가 채워지지 않습니다 (null이 삽입 된 것처럼 보입니다).

나는 여기서 무슨 일이 일어나고 있는지 알아 내려고 정말로 애 쓰고 있습니다. 마치이 서블릿의 인스턴스가 guice 컨텍스트 외부에서 만들어진 것처럼 보입니다. 이 중요한 경우에 - 우리는


여기 내 guice 설정의 나머지 부분입니다 (내가 실제 이름을 게시 할 수 있는지 알고하지 않습니다, 모든 XXX 년대 미안)

보스 7.1을 사용하는

public class XXXServletContextListener extends GuiceServletContextListener { 

    @Override 
    protected Injector getInjector() { 
     return Guice.createInjector(new XXXUploadModule(), new XXXServletModule()); 
    } 
} 

여기에 내가 Guice 서블릿 통합이 작동하는 방법에 익숙하지 않은,하지만 일을 갖는 서블릿 모듈

public class XXXServletModule extends ServletModule { 

    @Override 
    protected void configureServlets() { 
     serve("/xxx1").with(XXXDetailsServlet.class); // this one fails on post 
     serve("/xxx2").with(XXXUploadServlet.class); // this one works 
    } 
} 

답변

4

입니다 e @WebServlet("/Medical_Web") annotation은 웹 컨테이너가 서블릿을 인스턴스화하여 요청을 처리한다는 것을 의미합니다. 실제로 그것들은 싱글 톤이라는 개념을 가지고 있지 않습니다.

제 생각에는 주석을 제거하고 ServletModule 서블릿 라이프 사이클을 제어해야합니다.

+0

+1, XXXDetailsServlet은 실제로 Guice 범위의 싱글 톤이지만 여기서 컨테이너에 의해 직접 인스턴스화됩니다. –

+0

고맙습니다. –