我的项目中有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
}
}
答案 0 :(得分:4)
我不熟悉Guice servlet集成的工作原理,但是使用@WebServlet("/Medical_Web")
注释意味着您的Web容器也将实例化该servlet以提供请求。实际上它们是一个池,它没有单身概念。
我猜你只需删除注释,让ServletModule
控制servlet的生命周期。