Java-在Spring引导中使用AXIS更改SOAP请求格式
我试图在Spring Boot中使用SOAP web服务。并使用Axis生成类 我正在从客户机发送soap请求,它在向服务器发送请求时正在更改请求的格式 请查找发送请求的客户端和接收请求的服务器,如下所示:Java-在Spring引导中使用AXIS更改SOAP请求格式,java,spring-boot,soap,axis,soap-client,Java,Spring Boot,Soap,Axis,Soap Client,我试图在Spring Boot中使用SOAP web服务。并使用Axis生成类 我正在从客户机发送soap请求,它在向服务器发送请求时正在更改请求的格式 请查找发送请求的客户端和接收请求的服务器,如下所示: SOAP Client sending Request: <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:prim="http://..../..Servi
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>
// 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);
}
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>
// 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
。。。
... 代码>
和XMLB
。。。
您的用例的所有部分都是相同的。除了这里和那里的几个字符串之外,没有什么区别
对于XML A,名称空间是在根级别定义的,
因此,子节点需要有本地名称前缀来标识(尽管如果没有冲突的\同名节点,可能会跳过,这似乎是您的情况),它属于名称空间soap
或prim
对于XML B,命名空间是在父节点
(UserList)级别定义的,因此可以避免所有子节点都有localname前缀。i、 e.为一个元素定义一个默认名称空间可以避免在所有子元素中使用前缀。
我希望这能回答你的问题
有关更多详细信息,请参阅。根据xml,我同意您的看法。但是现有的SOAP服务不接受没有前缀的请求。那么,是否有可能创建与上面相同的请求,就像在java中使用前缀一样。谢谢@Red Boy是的,这是有办法的,但这取决于你们使用的图书馆。如果您正在使用JAXB,看看它是否能帮助您。不,我没有使用JAXB,我使用axis从wsdl生成类,axis使用序列化器和反序列化器转换xml,我已经更新了上面的代码。请检查并帮助解决这个问题。谢谢@Red Boy你必须修改豆子。像这样,
publicstaticfinalqname MY_QName=newqname(“http://www.hello.com/Service/“,”标记名“,”前缀“
refereso前缀需要设置为请求中的所有元素,如elemField.setXmlName(newjavax.xml.namespace.QName()http://..../..Services“,”MessageID“,”prim“);。请确认。谢谢@Red boy,您需要提供有关用于Bean到XML序列化的底层API的附加信息。