Java - изменение формата запроса SOAP с использованием AXIS в Spring Boot - PullRequest
0 голосов
/ 11 июня 2018

Я пытался использовать веб-сервис SOAP в Spring Boot.и сгенерировал классы, используя Axis.

Я отправляю запрос мыла от клиента, и он изменяет формат запроса при переходе на сервер.

Найдите клиент, отправляющий запрос, и сервер получаетзапрос, как показано ниже:

SOAP Client sending Request:

      <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:prim="http://..../..Services">
        <soapenv:Header />
        <soapenv:Body>
          <prim:UserList>
            <prim:XMLRequest>
              <prim:Header>
                <prim:MessageID>1</prim:MessageID>
                <prim:CorrelationID>1</CorrelationID>
              </prim:Header>
            </prim:XMLRequest>
          </prim:UserList>
        </soapenv:Body>
      </soapenv:Envelope>

SOAP Server receiving Request:

      <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
        <soapenv:Body>
          <UserList xmlns="hhttp://..../..Services">
            <XMLRequest>
              <header>
                <MessageID>1</MessageID>
                <CorrelationID>1</CorrelationID>
              </header>
            </XMLRequest>
          </UserList>
        </soapenv:Body>
      </soapenv:Envelope>

Пытаясь позвонить, используя следующий код:

public  UserListResponse UserListService(UserList request)
            throws RemoteException, ServiceException {


        UserListRequest xmlRequest = new UserListRequest();

        Header reqHeader = request.getXMLRequest().getHeader();

        Header header = new Header();

        header.setCorrelationID(reqHeader.getCorrelationID());
        header.setMessageID(reqHeader.getMessageID());

        xmlRequest.setHeader(header);

        return soapStub.UserList(xmlRequest);

    }

Сериализатор Axis & deSerializer код, как показано ниже:

// Type metadata
private static org.apache.axis.description.TypeDesc typeDesc =
    new org.apache.axis.description.TypeDesc(Header.class, true);

static {
    typeDesc.setXmlType(new javax.xml.namespace.QName("http://..../..Services", "Header","prim"));

    org.apache.axis.description.ElementDesc elemField = new org.apache.axis.description.ElementDesc();
    elemField.setFieldName("messageID");
    elemField.setXmlName(new javax.xml.namespace.QName("http://..../..Services", "MessageID","prim"));
    elemField.setXmlType(new javax.xml.namespace.QName("http://www.w3.org/2001/XMLSchema", "string"));
    elemField.setMinOccurs(0);
    elemField.setNillable(false);
    typeDesc.addFieldDesc(elemField);
    elemField = new org.apache.axis.description.ElementDesc();
    elemField.setFieldName("correlationID");
    elemField.setXmlName(new javax.xml.namespace.QName("http://..../..Services", "CorrelationID","prim"));
    elemField.setXmlType(new javax.xml.namespace.QName("http://www.w3.org/2001/XMLSchema", "string"));
    elemField.setMinOccurs(0);
    elemField.setNillable(false);
    typeDesc.addFieldDesc(elemField);


}

/**
 * Return type metadata object
 */
public static org.apache.axis.description.TypeDesc getTypeDesc() {
    return typeDesc;
}

/**
 * Get Custom Serializer
 */
public static org.apache.axis.encoding.Serializer getSerializer(
       java.lang.String mechType, 
       java.lang.Class _javaType,  
       javax.xml.namespace.QName _xmlType) {
    return 
      new  org.apache.axis.encoding.ser.BeanSerializer(
        _javaType, _xmlType, typeDesc);
}

/**
 * Get Custom Deserializer
 */
public static org.apache.axis.encoding.Deserializer getDeserializer(
       java.lang.String mechType, 
       java.lang.Class _javaType,  
       javax.xml.namespace.QName _xmlType) {
    return 
      new  org.apache.axis.encoding.ser.BeanDeserializer(
        _javaType, _xmlType, typeDesc);
}

Может кто-нибудь, пожалуйста, помогитена этом.

1 Ответ

0 голосов
/ 12 июня 2018

Я не уверен, почему вы беспокоитесь о месте префикса пространства имен XML.

Логически XML A

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:prim="http://..../..Services">... <prim:UserList>...</prim:UserList> </soapenv:Body> </soapenv:Envelope>

И XML B

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">... <UserList xmlns="hhttp://..../..Services"> </UserList> </soapenv:Body> </soapenv:Envelope>

вашего варианта использования одинаковы.Здесь нет разницы, за исключением нескольких строковых символов.

В случае XML A пространства имен определяются на корневом уровне, следовательно, для идентификации дочернему элементу требуется локальный префикс имени (хотя его можно пропустить, если нет конфликтующих\ узлы с тем же именем, что кажется вашим случаем), он принадлежит пространству имен soap или prim.

В случае XML B пространство имен определяется на уровне parent node (UserList), следовательно, все дочерниеузлы можно было бы избежать иметь префикс localname.т.е. Defining a default namespace for an element saves us from using prefixes in all the child elements.

Я надеюсь, что это ответ на ваш вопрос.

Обратитесь Пространство имен XML для получения более подробной информации.

...