guice servlet不是单身人士

时间:2012-10-30 20:20:50

标签: java servlets dependency-injection guice guice-servlet

发生了可怕的事情

我的项目中有2个servlet - 其中一个只有一个post方法,负责处理文件上传。我最近添加了另一个 - 它有一个get和post方法。

这是第二个servlet代码

@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 - servlet地址肯定会回归不同。我在post方法中点击一个空指针时最初注意到这一点 - 每当我调用get方法时,我回来的servlet实例都填充了所有字段。每当我调用post方法时,我回来的servlet实例(它是一个不同的实例)没有填充字段(只是null,似乎它们没有被注入)。

我真的在努力弄清楚这里发生了什么。似乎这个servlet的实例是在guice上下文之外创建的。如果重要 - 我们正在使用JBoss 7.1

(抱歉所有的XXX,不知道我是否可以发布实际名字)


这是我的其他设置

public class XXXServletContextListener extends GuiceServletContextListener {

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

这是servlet模块

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 个答案:

答案 0 :(得分:4)

我不熟悉Guice servlet集成的工作原理,但是使用@WebServlet("/Medical_Web")注释意味着您的Web容器也将实例化该servlet以提供请求。实际上它们是一个池,它没有单身概念。

我猜你只需删除注释,让ServletModule控制servlet的生命周期。