Spring soap ws不在XML标记中没有名称空间前缀的请求下运行

时间:2019-10-11 20:23:37

标签: spring-boot soap

我有一个已经生成的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可以工作。

1 个答案:

答案 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。