Статьи

Обучение веб-сервису с помощью Apache CXF

В моих последних двух проектах я работал с веб-сервисами, создавая их в одних местах и ​​потребляя их в других. Я чувствовал, что стандартные задачи, такие как создание клиента, создание веб-службы и т. Д., Довольно просты и ресурсов достаточно, если вы застряли. Но с веб-сервисами, это некоторая тривиальная задача, которая может занять много вашего времени, и вы чувствуете себя разочарованным, когда не можете сделать эту простую вещь правильно.

логирование

В одном из проектов мы создали веб-сервисы с использованием Apache CXF, и все работало нормально. Была только одна проблема, Apache CXF использует java.util logger для регистрации и используется для печати всех видов журналов. Наше приложение использовало Log4J, поэтому задача была проста — использовать Log4J для Cxf и управления журналами.

Настройка регистратора для использования Log4J — задача starightfoward, как упоминалось на сайте Apache CXF , вот что говорится на странице:

Добавьте файл META-INF / cxf / org.apache.cxf.Logger в путь к классам и убедитесь, что он содержит следующее содержимое: org.apache.cxf.common.logging.Log4jLogger

Просто вам нужно добавить файл в каталог META-INF, и это будет сделано. У нас был проект maven для генерации войны, поэтому я создал файл в папке META-INF, который генерируется для войны, то есть в src / main / webapp / META-INF.

Теперь файл есть, но ведение журнала было неуправляемым, CXF все еще использовал java logger. Я потратил на это больше времени, чтобы понять, что я сделал неправильно. Потребовалось еще немного усилий, чтобы понять, что я пропустил и важные инструкции «в classpath». Папка META-INF, которая генерируется помимо WEB-INF, не находится в пути к классам, а папка META-INF требуется в папке классов войны.

После слов, оглядывающихся назад на эту проблему, мне было глупо пропускать часть пути к классам, но я также не мог понять, почему ребята из CXF выбирают папку META-INF для своих файлов конфигурации. META-INF существует на платформе Java для сервисов и загрузчиков классов. Это становится довольно двусмысленным, когда фреймворки начинают использовать его для своих конфигураций, а затем появляется множество папок, которые можно поиграть, что может сделать вещи совершенно неясными.

Мыло обработчики

В другом месте у нас было требование, где мы должны перехватывать входящие / исходящие запросы на мыло и затем что-то делать с этим. Apache CXF предоставляет перехватчики, которые можно использовать для выполнения этой задачи. Вы можете иметь некоторые входящие и исходящие связи, и они будут делать, как просили. Но мы использовали реализацию jaxws, которая поставляется с java. Не намереваясь перевести наших существующих клиентов на CXF, поскольку у нас было довольно много клиентов, нам потребовалось некоторое время, чтобы выяснить, как вы можете сделать это с помощью jaxws.

По сути, в соответствии со спецификацией JAX-WS у вас может быть несколько SoapHandler, которые можно настроить с помощью клиента. Обработчик будет вызываться каждый раз, когда происходит обмен сообщениями SOAP. В обработчике вы можете определить, является ли это внутренним сообщением или внешним, и затем выполнить свою логику. Это шаги, необходимые для настройки обработчика:

Создайте класс, расширяющий интерфейс SoapHandler, и реализуйте метод сообщения дескриптора:

01
02
03
04
05
06
07
08
09
10
11
12
class CustomHandler implements SOAPHandler<SOAPMessageContext>{
 // TODO: implement other methods
 public boolean handleMessage(SOAPMessageContext context) {
  // Check for message status
  Boolean outboundProperty = (Boolean)
   context.get(MessageContext.MESSAGE_OUTBOUND_PROPERTY);
  if (null == outboundProperty || !outboundProperty) {
      log.debug("not an outbound message");
      return true;
  }
 }
}

Обработчики похожи на фильтры сервлетов. Они в цепочке и их называют по очереди. Поэтому нам нужно создать XML-файл, в котором мы можем настроить все нужные нам обработчики.

01
02
03
04
05
06
07
08
09
10
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<javaee:handler-chains
     xmlns:javaee="http://java.sun.com/xml/ns/javaee"
     xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <javaee:handler-chain>
    <javaee:handler>
      <javaee:handler-class>pkg.CustomHandler</javaee:handler-class>
    </javaee:handler>
  </javaee:handler-chain>
</javaee:handler-chains>

Кроме того, файл конфигурации должен находиться в пути к классам, поскольку он будет импортирован в создаваемые нами клиенты веб-служб. После того, как это будет сделано, нам нужно включить эту цепочку обработчиков на клиенте веб-службы.

1
2
3
4
@WebServiceClient(.....)
@HandlerChain(file="handlerFile.xml")
public class SampleServiceImpl extends Service{
}

Концепция обработчика взята из спецификации jaxws и будет работать на всех ее реализациях, таких как metro, CXF и т. Д.

Справка: материалы веб-сервиса от нашего партнера по JCG Рахула Шарма на «Путь до сих пор…». блог

Статьи по Теме :