从wsdl生成java类

从wsdl生成java类,java,soap,jaxb,wsdl,cxf,Java,Soap,Jaxb,Wsdl,Cxf,我有一个wsdl,从中我使用ApacheCXF生成了服务器存根。问题是我部署的新wsdl与初始wsdl不同,所以旧wsdl的soap请求对新wsdl不起作用。我使用soapUI测试它。新的名称空间有这样一个奇怪的名称空间init: <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:init="http://initiator.clientprovisioning_1_0.md

我有一个wsdl,从中我使用ApacheCXF生成了服务器存根。问题是我部署的新wsdl与初始wsdl不同,所以旧wsdl的soap请求对新wsdl不起作用。我使用soapUI测试它。新的名称空间有这样一个奇怪的名称空间init

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" 
xmlns:init="http://initiator.clientprovisioning_1_0.mdm.smarttrust.com/">
   <soapenv:Header/>
   <soapenv:Body>
      <init:cpDiscovery.Response>

旧的soap消息没有以下内容:

<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>
      <cpDiscovery.Response>

我会提供任何需要的额外信息。我已经试着解决这个问题两天了。请帮忙

编辑 这个init前缀取决于java包的第一个字母。例如,如果类位于me.mycompany.example前缀中:

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:exam="http://example.mycompany.net/">
   <soapenv:Header/>
   <soapenv:Body>
      <exam:cpDiscovery.Response>

编辑 这说明

targetNamespace属性指定在其下定义服务的目标命名空间。如果未指定此属性,则目标命名空间将从包名称派生


如何消除这种情况?

您已经在XML模式中引入了一个名称空间来描述SOAP负载。这不应该影响客户机调用您的服务的能力,只要他们可以访问模式文件。

旧的soap消息实际上是无效的,可能永远不会起作用。根据soap规范,soap:Body的子级必须是命名空间限定的。“新”行为似乎就是您想要的行为。

自原始代码生成以来,WSDL是否已更改?是否有任何方法可以恢复到旧的WSDL?您的WSDL是由服务器上的某个框架自动生成的吗?如果是这样,请尝试使用相同的框架生成您的客户端。在我的本地磁盘上没有。我在代码生成过程中遇到了一些问题谢谢您的回复。我该如何解决这个问题?我想要旧的行为。有没有办法删除前缀?Cxf似乎有这些东西——拦截器和转换。我可以使用这些来动态地为“旧soap消息”添加前缀吗?您可以使用转换功能:限定元素。cpDiscovery.Response->{}cpDiscovery.Response的inTransformElements映射应该可以做到这一点非常感谢你,Daniel。上帝保佑你。