Java - 在 Spring Boot 中使用 AXIS 更改 SOAP 请求格式



我尝试在Spring Boot中使用SOAP Web服务,并使用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 Serializer& 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);
}

任何人都可以帮忙吗?

我不确定,为什么你非常关心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,命名空间在根级别定义, 因此,子级需要具有本地名称前缀来标识(尽管如果没有冲突\同名节点,则可以跳过,这似乎是您的情况(,它属于命名空间soapprim

在 XML B 的情况下,命名空间是在parent node(UserList(级别定义的,因此可以避免所有子节点都具有本地名称前缀。Defining a default namespace for an element saves us from using prefixes in all the child elements.

我希望这能回答你的问题。

有关更多详细信息,请参阅 XML 命名空间。

最新更新