1

リクエスト スコープ Bean を他の Bean に注入したいと考えています。

@Component
@Scope(value = WebApplicationContext.SCOPE_REQUEST)
public class UiCtx {

    @Autowired(required = true)
    private ApplicationContext ctx;

    @Autowired(required = true)
    private ServletWebRequest req;

    // [...]
}

この Bean を Bean に注入しようとしていJPageます。

@Component
@Scope("prototype")
public class Jpage extends AbstractUiComponent {
   // [...]
}

public abstract class AbstractUiComponent  {

    @Autowired(required = true)
    private UiCtx ctx;
    // [...]
}

私が試したコントローラーで:

@RestController
class GreetingController {

    @RequestMapping("/jpage")
    void jpage(HttpServletRequest request, HttpServletResponse response,
            @Autowired @Qualifier("jpage") AbstractUiComponent jpage) throws IOException {
        WritePage.writeWebPage(request, response, jpage);
       }
    }
}

私が得た:

[pl.mirage.components.AbstractUiComponent] のインスタンス化に失敗しました: 抽象クラスですか?; ネストされた例外は java.lang.InstantiationException です

別の試み。シングルトンであるため機能しません@RestController-リクエストスコープをシングルトンスコープに挿入することはできません:

@RestController
class GreetingController {

    @Autowired
    @Qualifier("jpage")
    AbstractUiComponent jpage;

    @RequestMapping("/jpage")
    void jpage(HttpServletRequest request, HttpServletResponse response) throws IOException {
        WritePage.writeWebPage(request, response, jpage);
    }
}

私が得た:

org.springframework.beans.factory.UnsatisfiedDependencyException: 'greetingController' という名前の Bean の作成中にエラーが発生しました: フィールド 'jpage' で表現された依存関係が満たされていません。ネストされた例外は org.springframework.beans.factory.UnsatisfiedDependencyException: 'jpage' という名前の Bean の作成中にエラーが発生しました: フィールド 'ctx' で表現された依存関係が満たされていません。ネストされた例外は org.springframework.beans.factory.BeanCreationException: 'uiCtx' という名前の Bean の作成中にエラーが発生しました: スコープ 'request' は現在のスレッドに対してアクティブではありません。シングルトンから参照する場合は、この Bean のスコープ付きプロキシを定義することを検討してください。ネストされた例外は java.lang.IllegalStateException: No thread-bound request found: 実際の Web リクエスト以外のリクエスト属性を参照していますか? または、最初に受信したスレッドの外でリクエストを処理しますか? 実際に Web リクエスト内で操作していてもこのメッセージが表示される場合、コードはおそらく DispatcherServlet/DispatcherPortlet の外部で実行されています。この場合、RequestContextListener または RequestContextFilter を使用して現在のリクエストを公開します。

注釈を付けるか、UICtxまたはJPageとしてこれを修正することが可能@Scope(value = "[..]", proxyMode = ScopedProxyMode.TARGET_CLASS)です。

JPageがコントローラ フィールドとして挿入された場合にのみ機能します。JPageメソッドのパラメータとして注入された場合は機能しません。

リクエストスコープのBeanを注入するにはどうすればよいですか?

4

1 に答える 1

0

エラーメッセージに示されているアドバイス (太字で強調) に従ってください。

BeanCreationException: 'uiCtx' という名前の Bean の作成中にエラーが発生しました: スコープ 'request' は現在のスレッドに対してアクティブではありません。シングルトンから参照する場合は、この Beanのスコープ付きプロキシを定義することを検討してください。

依存関係が注入された状態でproxyModeアプリを起動するには、定義が必要です。UICtx

@Component
@Scope(value = WebApplicationContext.SCOPE_REQUEST, proxyMode = ScopedProxyMode.TARGET_CLASS)
public class UiCtx {
   // omitted class body
}

または省略形@RequestScopeBaeldung チュートリアルを参照するか、 Tom のコメントにリンクされている複製を参照してください。

リクエスト スコープの Bean を別の Bean に注入する

于 2022-01-05T20:27:07.483 に答える