2

クライアントとサーバーの 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 jcrSessionSessionFactoryクラスごとに作成されます。次に、これ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()

4

0 に答える 0