5

私はアプリでSpringフレームワーク(2.5.4)をロードタイムウィービングで使用しており、@ Configurableとして注釈が付けられたサーブレットでフィールドを自動配線しようとした場合を除いて、すべてがどこでも正常に機能します(Spring Bean、非Springエンティティ)。素敵なNullPointerExceptionが発生します...


@Configurable(dependencyCheck=true)
public class CaptchaServlet extends HttpServlet{
    @Autowired
    private CaptchaServiceIface captchaService;

    @Override
    public void init(ServletConfig config) throws ServletException {
        super.init(config);
    //    ApplicationContext ctx = WebApplicationContextUtils.getRequiredWebApplicationContext(config.getServletContext());
    //    captchaService = (CaptchaServiceIface) ctx.getBean("captchaService");
    }

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        Captcha c = captchaService.getCatpcha();
        req.getSession().setAttribute("captchaAnswer", c.getAnswer());
        resp.setContentType("image/png");
        ImageIO.write(c.getImage(), "png", resp.getOutputStream());
    }
}

<context:load-time-weaver/>
<context:spring-configured/>
<context:component-scan base-package="cz.flexibla2" />

私が間違って何をしているのかについての提案はありますか?

ありがとう。

4

2 に答える 2

6

これは、Springコンテキストが初期化される前に、サーブレットがサーブレットコンテナによってインスタンス化および初期化されており、ロード時のウィービングを処理するのはSpringコンテキストであるためと考えられます。

サーブレットのSpringコンテキスト内で処理されています<context:load-time-weaver/>か、それともWebアプリケーションレベルで処理されていますか?前者は(上記の理由で)ほぼ確実に機能しませんが、webappレベルの構成は(を使用してContextLoaderListener)機能する可能性があります。

于 2010-11-15T12:28:26.807 に答える
3

https://bugs.eclipse.org/bugs/show_bug.cgi?id=317874のメーリングリストディスカッションとバグレポートも参照してください。直感的に、サーブレットの@Configurableアノテーションは、インスタンス化されたときのサーブレットが、使用時にSpringによって構成されることをSpringFrameworkに示すのに十分である必要があることに同意します。<context:spring-configured/>。また、spring-instrument * .jarまたはspring-agent.jarの代わりに-javaagent:/path/to/aspectjweaver.jarを使用すると、目的の動作を実現できることも確認しました。https://jira.springframework.org/browse/SPRでSpringJiraに関する問題を提起してください。問題は、サーブレットクラス(サーブレットのインスタンスではなく、クラス自体)がSpring ContextLoaderListenerが呼び出される前にロードされるため、Springフレームワークがサーブレットクラスをインストルメントする機会がないことであると考えています。ロードされました。

ロード時のウィービングのためのスプリングインストルメンテーションは、ロードされる前にクラスバイトコードを変換できることに基づいているようです。サーブレットコンテナがSpringによって変換される前に取得されたClassオブジェクトのインスタンスを保持している場合、それ(サーブレットコンテナ)は変換されたクラスのインスタンスを生成できず、Springはインスタンスをインストルメントできません。そのClassオブジェクトのファクトリメソッドを使用して作成されます。

于 2010-12-07T17:28:11.360 に答える