2

大変なことが起きています

私のプロジェクトには 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 
    }
}
4

1 に答える 1

4

私は Guice サーブレット統合がどのように機能するかについてよく知りませんが、@WebServlet("/Medical_Web")アノテーションがあるということは、Web コンテナーもそのサーブレットをインスタンス化してリクエストを処理することを意味します。実際にはそれらのプールであり、シングルトンの概念はありません。

私の推測では、注釈を削除しServletModuleてサーブレットのライフサイクルを制御するだけでよいのです。

于 2012-10-31T00:18:15.593 に答える