リクエスト スコープ 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を注入するにはどうすればよいですか?