Я знаю, что вы пока не хотите это слышать, но вы неправильно поняли архитектуру.Контекст приложения JSF бесполезен для вызовов веб-служб, поскольку вся идея JSF состоит в том, что графический интерфейс пользователя построен из компонентов с состоянием, хранящихся:
- в сеансе пользователя или:
- в скрытомполе формы.
Поскольку ни сеанс, ни формы не доступны для вызовов веб-службы, JSF здесь не применяется.Вы также можете спросить, как сделать веб-сервис, который нажимает JButton или вставляет компакт-диск в ваш CD-ROM.
Я понимаю, что вам не нужны компоненты JSF, а скорее нужна некоторая логика приложения, которая постоянно находитсявнутри одного из управляемых bean-компонентов, верно?
Что ж, самое простое решение - получить машину времени, вернуться назад во времени, когда проект был запланирован, и сказать архитектору, что НИКОГДА НЕ СДЕЛАЙТЕ ЛОГИКУ ПРИЛОЖЕНИЯ В УПРАВЛЯЕМЫХ БИНАХ,Одна из причин заключается в том, что они недоступны для вызовов веб-служб.Логика вашего приложения должна находиться на уровне сервисов, предоставляемом Spring или EJB.
Как Spring-компоненты, так и EJB-компоненты легко доступны из сервисов Axis и из управляемых bean-компонентов, поэтому вам никогда не нужно получать доступ к управляемым bean-компонентам JSF излюбое место, кроме JSF-интерфейса.Если вам не нравится Spring и по какой-то причине вы не можете использовать EJB, создайте свой сервисный уровень из POJO, настройте его в ApplicationContextListener и зарегистрируйте в области приложения.
Если такое чистое решение недоступно и рефакторингневозможно, у вас есть два варианта:
если управляемые bean-объекты, к которым вы пытаетесь обратиться, являются областью действия приложения и стремятся к ним, то к ним можно получить доступ JSP-способом из контекста приложения, используяДостойный метод getAttribute (доступ к контексту приложения можно получить через контекст сервлета, к которому вы обращаетесь через контекст сообщения, к которому, в свою очередь, вы обращаетесь через статический метод MessageContext.getCurrentMessageContext в Axis).
если управляемые bean-компоненты, которые вы хотите использовать, являются областью запроса и требуют некоторого JSF-соединения (так что вы не можете создавать их экземпляры самостоятельно), тогда вы можете притвориться FacesServlet и создать контекст лица самостоятельно;это сложно, но выполнимо, хорошее и довольно известное описание здесь: http://www.thoughtsabout.net/blog/archives/000033.html. Вам понадобятся servletrequest и servletresponse (из MessageContext).Вы, вероятно, можете пропустить детали, необходимые для передачи FacesContext, потому что вам не потребуется обрабатывать какие-либо представления.
Отказ от ответственности: я никогда не пробовал последнее решение - похоже, оно работает,хотя он довольно грязный (и фактически заставляет ваши веб-сервисы зависеть от JSF, который является странным).