логирование
В одном из проектов мы создали веб-сервисы с использованием 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 < 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 Рахула Шарма на «Путь до сих пор…». блог