Область 'сессия' не активна для текущего потока - PullRequest
2 голосов
/ 18 февраля 2012

У меня есть два приложения Spring: клиент и сервер.На серверном приложении есть сервисы, на клиентском - логика представления.Оба приложения должны взаимодействовать через веб-службы, но это не сработало из-за ошибки

Ошибка обработки запроса;Вложенное исключение: org.springframework.remoting.jaxws.JaxWsSoapFaultException: Ошибка при создании bean-компонента с именем scopedTarget.jcrSession: Session Session не активен для текущего потока;рассмотрите возможность определения прокси-объекта с заданной областью действия для этого компонента, если вы собираетесь ссылаться на него из одноэлементного объекта;Вложенное исключение - java.lang.IllegalStateException: не найден привязанный к потоку запрос: Вы ссылаетесь на атрибуты запроса вне фактического веб-запроса или обрабатываете запрос вне первоначально получающего потока?Если вы действительно работаете в веб-запросе и по-прежнему получаете это сообщение, ваш код, вероятно, выполняется за пределами DispatcherServlet / DispatcherPortlet: в этом случае используйте RequestContextListener или RequestContextFilter, чтобы выставить текущий запрос.

Onсерверное приложение Я использую сеанс JCR (сессионный компонент)

<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, созданным серверным приложением вбраузер, все ок.Когда я использую сервисы приложения сервера локально (например, в контроллере на приложении сервера), все также в порядке.Итак, почему эта ошибка возникает, когда я пытаюсь получить доступ к службам через веб-службы из удаленного приложения?

Update1 jcrSession создается классом SessionFactory.Затем этот jcrSession автоматически подключается к объектам 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();
    }
}

Кроме того, произошла та же ошибка, когда я пытался автоматически подключить службу в том же приложении и использовать ее в методе, аннотированном @PostConstruct илив реализации InitializingBean в методе afterPropertiesSet()

...