것이 아닙니다. 나는 최근에 다른 하나를 추가했다 - 그것은 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
}
}
+1, XXXDetailsServlet은 실제로 Guice 범위의 싱글 톤이지만 여기서 컨테이너에 의해 직접 인스턴스화됩니다. –
고맙습니다. –