Как добавить XML-схему в SoapBody приложения SoapMessage в Apache CXF? - PullRequest
1 голос
/ 11 октября 2010

есть ли способ изменить сообщение SoapBody, используя Apache CXF?Я попытался использовать функцию перехватчиков с режимом Phase.SEND, чтобы попытаться добавить схему XML с результатом в SoapBody.Мне не повезло.

Проблема заключалась в том, что я хочу проверить полученное сообщение с помощью XML-схемы.Текущий вывод SoapBody отправил сообщение о результате со схемой xml, в которой использовалась ссылка на местоположение схемы, которое было недоступно в целевом местоположении.

Чтобы проверить ответное сообщение результата, я добавил «схема-проверка-включена» как true в ResponseContext в BindingProvider;Однако я не уверен, работает ли он или нет.

Я пытался добавить / прикрепить оригинальную схему вместо того, чтобы использовать ее ссылку с ответным сообщением для SoapBody.Есть ли способ использовать аннотации или любые другие методы, чтобы использовать данную схему XML для проверки?

Любая идея и ответ приветствуются.

<?xml version="1.0" encoding="utf-8"?>
    <xs:schema id="resultSet" targetNamespace="http://www.xxx.com/" xmlns:mstns="http://www.xxx.com/" xmlns="http://www.xxx.com/" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata" attributeFormDefault="qualified" elementFormDefault="qualified" xmlns:app1="http://www.xxx.com/ResultSet.xsd">
      <xs:import namespace="http://www.xxx.com/ResultSet.xsd" schemaLocation="RalsDeviceService_app1.xsd" />
      <xs:element name="resultSet" msdata:IsDataSet="true" msdata:Locale="en-US">
        <xs:complexType>
          <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element ref="app1:ResultSet" />
          </xs:choice>
        </xs:complexType>
      </xs:element>
    </xs:schema>
    <resultSet xmlns="http://www.xxx.com/">
      <ns2:ResultSet xmlns:ns2="http://www.xxx.com/ResultSet.xsd">
        <ns2:Results>
         ...
         ..
         .
    </resultSet>

1 Ответ

0 голосов
/ 29 августа 2011

над этой проблемой я работал три дня =) Путь Inteceptor не неправильный.Это моя простая демонстрационная реализация

 public static class MySendingReturn extends AbstractPhaseInterceptor<Message> {

    public MySendingReturn() {
        super(Phase.SEND);
    }

    @Override
    public void handleMessage(Message message) throws Fault {
        XMLStreamWriter content = message.getContent(XMLStreamWriter.class);
        try {

            MySchema context = new MySchema();
            content.writeStartElement("testOperationWithParameter");
            content.writeStartElement("returnValue");
            content.writeCharacters("Halllllo-Return");
        } catch (XMLStreamException e) {
            e.printStackTrace();
        }
    }
}

Текущий элемент XMLStreamWriter является элементом BODY SoapMessage.Этот перехватчик я регистрирую на своем сервисном экземпляре:

 service.getOutInterceptors().add(new MySendingReturn());
...