クライアントとサーバーの 2 つの Spring アプリケーションがあります。サーバー アプリケーションにはサービスがあり、クライアント アプリにはビュー ロジックがあります。両方のアプリは Web サービスを介して通信する必要がありますが、エラーのために機能しませんでした
リクエストの処理に失敗しました。ネストされた例外は org.springframework.remoting.jaxws.JaxWsSoapFaultException: 'scopedTarget.jcrSession' という名前の Bean の作成中にエラーが発生しました: スコープ 'session' は現在のスレッドに対してアクティブではありません。シングルトンから参照する場合は、この Bean のスコープ付きプロキシを定義することを検討してください。ネストされた例外は java.lang.IllegalStateException: No thread-bound request found: 実際の Web 要求の外部で要求属性を参照していますか、または元の受信スレッドの外部で要求を処理していますか? 実際に Web リクエスト内で操作していてもこのメッセージが表示される場合、コードは DispatcherServlet/DispatcherPortlet の外部で実行されている可能性があります。この場合、RequestContextListener または RequestContextFilter を使用して現在のリクエストを公開します。
サーバーアプリでは、JCRセッション(セッションスコープのBean)を使用しています
<bean name="jcrSession" factory-bean="sessionFactory" factory-method="login" scope="session" destroy-method="logout" >
<aop:scoped-proxy/>
</bean>
私が持っているサーバーアプリのweb.xmlで
<listener>
<listener-class>org.springframework.web.context.request.RequestContextListener</listener-class>
</listener>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
サーバー アプリで生成された WSDL ファイルにブラウザーでアクセスすると、すべて問題ありません。サーバーアプリサービスをローカルで使用する場合(サーバーアプリのコントローラーなど)もすべて問題ありません。リモートアプリからWebサービスを介してサービスにアクセスしようとすると、なぜこのエラーが発生するのですか?
Update1
jcrSessionはSessionFactoryクラスごとに作成されます。次に、これjcrSessionは springs を使用して DAO オブジェクトに自動配線されます@Autowired。
Example of simplified `JcrSessionFactory`:
public class JcrSessionFactory {
private Repository repository;
private Credentials credentials;
private Session session;
public Session login() {
session = repository.login(credentials);
return session;
}
public void logout() {
session.logout();
}
}
また、同じアプリでサービスをオートワイヤしようとしたときに同じエラーが発生し、メソッドでアノテーションが付けられたメソッドまたは inメソッド@PostConstructの実装で使用しましたInitializingBeanafterPropertiesSet()