大変なことが起きています
私のプロジェクトには 2 つのサーブレットがあります。そのうちの 1 つは単純に post メソッドを持ち、ファイルのアップロードを処理します。最近、もう 1 つ追加しました。get メソッドと post メソッドがあります。
ここに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 としてマークされていますが - サーブレット アドレスは間違いなく別のものとして戻ってきます。post メソッドで null ポインターにヒットしたときに最初にこれに気付きました。get メソッドを呼び出すたびに、返されるサーブレットのインスタンスにすべてのフィールドが入力されます。post メソッドを呼び出すたびに、返されるサーブレットのインスタンス (別のインスタンス) にフィールドが入力されていません (null だけで、注入されなかったようです)。
ここで何が起こっているのかを理解するのに本当に苦労しています。このサーブレットのインスタンスは、guice コンテキストの外で作成されたようです。問題があれば - JBoss 7.1 を使用しています
(すべてのXXXについて申し訳ありません。実際の名前を投稿できるかどうかわかりません)
ここに私のguiceセットアップの残りがあります
public class XXXServletContextListener extends GuiceServletContextListener {
@Override
protected Injector getInjector() {
return Guice.createInjector(new XXXUploadModule(), new XXXServletModule());
}
}
これがサーブレットモジュールです
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
}
}