получить бин jsf в веб-сервисе axis2 как запрос к серверу - PullRequest
2 голосов
/ 09 февраля 2011

Я использую Eclipse axis2 для создания клиента веб-службы из WSDL.

Мой метод Impl:

public Output[] startProcess(Message[] Messages){
   MyApplicationBean managementBean = (MyApplicationBean) FacesContext.getCurrentInstance().getExternalContext().getApplicationMap().get("myapp");
...
}

Однако, когда я выполняю:

http://localhost:8080/MyProject/services/portStartProcessService с методом startProcess

В отладке tomcat я вижу, что он достигает моего метода, однако FacesContext.getCurrentInstance() возвращает ноль.

Мой web.xml (часть из него)

<servlet-mapping>
    <servlet-name>Faces Servlet</servlet-name>
    <url-pattern>*.jsf</url-pattern>
     <url-pattern>/services/*</url-pattern>
  </servlet-mapping>
<servlet-mapping>
    <servlet-name>AxisServlet</servlet-name>
    <url-pattern>/servlet/AxisServlet</url-pattern>
  </servlet-mapping>

Как использовать компоненты JSF (например, область приложения) в вызове веб-служб?

1 Ответ

2 голосов
/ 09 февраля 2011

Я знаю, что вы пока не хотите это слышать, но вы неправильно поняли архитектуру.Контекст приложения 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, который является странным).

...