Статьи

Веб-сервисы SOAP с использованием Apache CXF: добавление пользовательского объекта в качестве заголовка в исходящих запросах

Что такое CXF?

Apache CXF — это сервисная структура с открытым исходным кодом. CXF помогает вам создавать и разрабатывать сервисы с использованием API-интерфейсов программирования внешнего интерфейса, таких как JAX-WS и JAX-RS. Эти сервисы могут работать с различными протоколами, такими как SOAP, XML / HTTP, RESTful HTTP или CORBA, и работать с различными транспортными средствами, такими как HTTP, JMS и т. Д.

Как работает CXF?

Как вы можете видеть здесь  и  здесь , как обрабатываются вызовы службы cxf, большая часть функциональности во время выполнения Apache CXF реализуется перехватчиками. Каждая конечная точка, созданная средой выполнения Apache CXF, имеет потенциальные цепочки перехватчиков для обработки сообщений. Перехватчики в этих цепочках отвечают за преобразование сообщений между необработанными данными, передаваемыми по проводам, и объектами Java, обработанными кодом реализации конечной точки. 

Перехватчики в CXF

Когда клиент CXF вызывает сервер CXF, существует исходящая цепочка перехватчиков для клиента и входящая цепочка для сервера. Когда сервер отправляет ответ клиенту, существует исходящая цепочка для сервера и входящая для клиента. Кроме того, в случае SOAPFaults веб-служба CXF создаст отдельную цепочку обработки исходящих ошибок, а клиент создаст цепочку обработки входящих ошибок.

Перехватчики организованы в фазы, чтобы гарантировать, что обработка происходит в правильном порядке. Различные фазы, вовлеченные в цепочки Перехватчиков, перечислены в документации CXF  здесь.

Добавление вашего пользовательского перехватчика включает расширение одного из классов абстрактного интерцептора, который предоставляет CXF, и предоставление фазы, когда этот перехватчик должен быть вызван.

 Класс AbstractPhaseInterceptor — этот абстрактный класс предоставляет реализации для методов управления фазой интерфейса PhaseInterceptor. Класс  AbstractPhaseInterceptor  также обеспечивает реализацию по умолчанию метода  handleFault ()  .

Разработчики должны предоставить реализацию метода  handleMessage ()  . Они также могут предоставить другую реализацию для  метода handleFault ()  . Реализации, предоставленные разработчиком, могут манипулировать данными сообщения, используя методы, предоставляемые универсальным   интерфейсом org.apache.cxf.message.Message .

Для приложений, которые работают с сообщениями SOAP, Apache CXF предоставляет   класс AbstractSoapInterceptor . Расширение этого класса предоставляет метод  handleMessage () и  метод  handleFault ()  с доступом к данным сообщения в виде  объекта org.apache.cxf.binding.soap.SoapMessage  .  У  объектов SoapMessage есть методы для извлечения заголовков SOAP, конверта SOAP и других метаданных SOAP из сообщения.

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

Конфигурация пружины —

	<jaxws:client id="mywebServiceClient"
		serviceClass="com.saurzcode.TestService"
		address="http://saurzcode.com:8088/mockTestService">

		<jaxws:binding>
			<soap:soapBinding version="1.2" mtomEnabled="true" />
		</jaxws:binding>
	</jaxws:client>
	<cxf:bus>
		<cxf:outInterceptors>
			<bean class="com.saurzcode.ws.caller.SoapHeaderInterceptor" />
		</cxf:outInterceptors>
	</cxf:bus>

 Перехватчик: — 

public class SoapHeaderInterceptor extends AbstractSoapInterceptor {

	public SoapHeaderInterceptor() {

		super(Phase.POST_LOGICAL);

	}

	@Override
	public void handleMessage(SoapMessage message) throws Fault {

		List<Header> headers = message.getHeaders();

		TestHeader testHeader = new TestHeader();

		JAXBElement<TestHeader> testHeaders = new ObjectFactory()

		.createTestHeader(testHeader);

		try {

			Header header = new Header(testHeaders.getName(), testHeader,

			new JAXBDataBinding(TestHeader.class));

			headers.add(header);

			message.put(Header.HEADER_LIST, headers);

		} catch (JAXBException e) {

			e.printStackTrace();

		}

	}