我有一个已经生成的wsdl文件,我正在用它编写springboot soap ws,但是当我在soapUi中加载该wsdl文件以创建一个测试我的ws的请求时,我得到一个请求,该请求的嵌套标签缺少名称空间前缀。触发该请求后,由于没有前缀标记,springboot会给saaj soap异常造成404错误。
当我手动将名称空间前缀添加到所有标签时,ws正常工作。
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:web="http://webservice.studentinfo.com/">
<soapenv:Header/>
<soapenv:Body>
<web:studentData>
<student>
<name>?</name>
<roll_number>?</roll_number>
<address>
<house_number>?</house_number>
<street>?</street>
<city>?</city>
<state>?</state>
</address>
</student>
</web:studentData>
</soapenv:Body>
</soapenv:Envelope>
如果我在标记内的所有嵌套标记中添加“ web:”,则我的ws会按预期工作,但对于上述要求,它不会。由于我不能将wsdl格式更改为某些第三方应用程序的输出,因此有什么办法,通过调用此请求本身,我的ws可以工作。
答案 0 :(得分:0)
您可以像这样添加特定的映射器
public class MyNamespaceMapper extends NamespacePrefixMapper {
private static final String FOO_PREFIX = ""; // DEFAULT NAMESPACE
private static final String FOO_URI = "http://www.example.com/FOO";
private static final String BAR_PREFIX = "bar";
private static final String BAR_URI = "http://www.example.com/BAR";
@Override
public String getPreferredPrefix(String namespaceUri, String suggestion, boolean requirePrefix) {
if(FOO_URI.equals(namespaceUri)) {
return FOO_PREFIX;
} else if(BAR_URI.equals(namespaceUri)) {
return BAR_PREFIX;
}
return suggestion;
}
@Override
public String[] getPreDeclaredNamespaceUris() {
return new String[] { FOO_URI, BAR_URI };
}
}
您可以遵循此tutorial。但是,对于弹簧ws可能是个问题,您需要添加此配置弹簧ws。