[英]Customizing prefix and namespace location in soap request generated using wsdl file
I am struggling to understand why code-generated soap request on the left is not working, but if I tweak it to what's on the right, then it works? 我很难理解为什么左边的代码生成的肥皂请求不起作用,但是如果我把它调整到右边的那个,那么它有效吗?
Now that I know what needs to be done to make it work, how do I fix it ? 现在我知道需要做些什么来使它工作,我该如何解决它?
I added jaxws-maven-plugin
to my java project: 我在我的java项目中添加了jaxws-maven-plugin
:
<build>
<plugins>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>jaxws-maven-plugin</artifactId>
<version>2.5</version>
<configuration>
<sourceDestDir>src/main/java</sourceDestDir>
<wsdlDirectory>src/main/resources/wsdl</wsdlDirectory>
<wsdlFiles>
<wsdlFile>Flattened_Integrator7.0.wsdl</wsdlFile>
</wsdlFiles>
<keep>true</keep>
</configuration>
<executions>
<execution>
<goals>
<goal>wsimport</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
Notice in the picture above without prefix wsse
, it doesn't work. 请注意上图中没有prefix wsse
,它不起作用。
It has to be that word. 必须是那个词。 And it exists in wsdl
file. 它存在于wsdl
文件中。 Does anyone know how: 有谁知道如何:
namespace prefix
for " http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd " to be wsse
我可以强制namespace prefix
为“ http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd ”的namespace prefix
为wsse
soap envelope
and not in Security
section 强制代码在soap envelope
生成名称空间,而不是在Security
部分 So, I had to manually add prefix/namespace to envelope and rename all children's prefixes to wsse
. 因此,我必须手动将前缀/命名空间添加到信封中,并将所有子项的前缀重命名为wsse
。
Here is how I did it: 我是这样做的:
@Component
public class RequestClient {
private static final String WSSE_PREFIX = "wsse";
private static final String WSSE_NAMESPACE = "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd";
private static final String NS2_PREFIX = "ns2";
private static final String NS2_NAMESPACE = "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd";
private buildSoaprequest(){
...
SOAPEnvelope soapEnvelope = soapMessage.getSOAPPart().getEnvelope();
soapEnvelope.addNamespaceDeclaration(WSSE_PREFIX, WSSE_NAMESPACE);
soapEnvelope.addNamespaceDeclaration(NS2_PREFIX, NS2_NAMESPACE);
SOAPHeader soapHeader = soapMessage.getSOAPHeader();
removeUndesiredBodyNamespaceEntries(soapHeader.getChildElements());
soapHeader.setPrefix(WSSE_PREFIX);
addDesiredBodyNamespaceEntries(soapHeader.getChildElements());
soapMessage.saveChanges();
...
}
private void addDesiredBodyNamespaceEntries(Iterator childElements) {
while (childElements.hasNext()) {
final Object childElementNode = childElements.next();
if (childElementNode instanceof SOAPElement) {
SOAPElement soapElement = (SOAPElement) childElementNode;
soapElement.setPrefix(WSSE_PREFIX);
addDesiredBodyNamespaceEntries(soapElement.getChildElements());
}
}
}
private void removeUndesiredBodyNamespaceEntries(Iterator childElements) {
while (childElements.hasNext()) {
final Object childElementNode = childElements.next();
if (childElementNode instanceof SOAPElement) {
SOAPElement soapElement = (SOAPElement) childElementNode;
//remove any prefix/namespace entries added by JAX-WS in the body element
//it cannot be null, so it will leave wsse
for (String prefix : getNamespacePrefixList(soapElement.getNamespacePrefixes())) {
if (prefix != null) {
soapElement.removeNamespaceDeclaration(prefix);
}
}
// recursively remove prefix/namespace entries in child elements
removeUndesiredBodyNamespaceEntries(soapElement.getChildElements());
}
}
}
private Set<String> getNamespacePrefixList(Iterator namespacePrefixIter) {
Set<String> namespacePrefixesSet = new HashSet<>();
while (namespacePrefixIter.hasNext()) {
namespacePrefixesSet.add((String) namespacePrefixIter.next());
}
return namespacePrefixesSet;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.