wsimport 创建生成不同于源 wsdl 的 wsdl 的类
wsimport creates classes that produce a wsdl that is different from the source wsdl
我正在尝试使用 wsimport(或者更准确地说,我正在使用使用 wsimport 的 eclipse 向导)为 Web 服务生成新的服务器端类。源 WSDL 来自当前实现,通过 ../ServiceName?wsdl URL。
我的问题是,当我发布新类并导航到新的 ?wsdl URL 时,结果 WSDL 与原来的不同。这似乎是现有客户端尝试使用新版本服务时出错的原因。这是 WSDL 的一个小节,其中包含一个似乎会导致客户端出现问题的差异示例:
原文:
<wsdl:message name="executeResponse">
<wsdl:part element="impl:ServiceNameResult" name="ServiceNameResult"/>
</wsdl:message>
<wsdl:message name="executeRequest">
<wsdl:part element="impl:executeRequest" name="executeRequest"/>
</wsdl:message>
<wsdl:portType name="ServiceName">
<wsdl:operation name="execute" parameterOrder="executeRequest">
<wsdl:input message="impl:executeRequest" name="executeRequest"/>
<wsdl:output message="impl:executeResponse" name="executeResponse"/>
</wsdl:operation>
</wsdl:portType>
新:
<wsdl:message name="executeResponse">
<wsdl:part element="tns:ServiceNameResult" name="ServiceNameResult">
</wsdl:part>
</wsdl:message>
<wsdl:message name="execute">
<wsdl:part element="tns:executeRequest" name="executeRequest">
</wsdl:part>
</wsdl:message>
<wsdl:portType name="ServiceName">
<wsdl:operation name="execute">
<wsdl:input message="tns:execute" name="execute">
</wsdl:input>
<wsdl:output message="tns:executeResponse" name="executeResponse">
</wsdl:output>
</wsdl:operation>
</wsdl:portType>
更改在 portType 输入消息中。它从 "executeRequest" 重命名为 "execute"。
我不明白为什么这会改变或如何在 java 课程中更正它。所有注释似乎都是正确的。
似乎缺少 "Request" 后缀是 CXF 的一个特性而不是错误。我需要做的是更新我的客户端或实施服务器端拦截器:
http://cxf.apache.org/docs/interceptors.html
这个:
您将需要子类化 org.apache.cxf.service.factory.DefaultServiceConfiguration 并重写 getInputMessageName 方法以将 QName 附加到 "Request"。然后,您将必须配置 CXF 以将服务配置指向您的子类
如果我能弄清楚如何去做,这似乎也是一个很好的解决方案。
我正在尝试使用 wsimport(或者更准确地说,我正在使用使用 wsimport 的 eclipse 向导)为 Web 服务生成新的服务器端类。源 WSDL 来自当前实现,通过 ../ServiceName?wsdl URL。
我的问题是,当我发布新类并导航到新的 ?wsdl URL 时,结果 WSDL 与原来的不同。这似乎是现有客户端尝试使用新版本服务时出错的原因。这是 WSDL 的一个小节,其中包含一个似乎会导致客户端出现问题的差异示例:
原文:
<wsdl:message name="executeResponse">
<wsdl:part element="impl:ServiceNameResult" name="ServiceNameResult"/>
</wsdl:message>
<wsdl:message name="executeRequest">
<wsdl:part element="impl:executeRequest" name="executeRequest"/>
</wsdl:message>
<wsdl:portType name="ServiceName">
<wsdl:operation name="execute" parameterOrder="executeRequest">
<wsdl:input message="impl:executeRequest" name="executeRequest"/>
<wsdl:output message="impl:executeResponse" name="executeResponse"/>
</wsdl:operation>
</wsdl:portType>
新:
<wsdl:message name="executeResponse">
<wsdl:part element="tns:ServiceNameResult" name="ServiceNameResult">
</wsdl:part>
</wsdl:message>
<wsdl:message name="execute">
<wsdl:part element="tns:executeRequest" name="executeRequest">
</wsdl:part>
</wsdl:message>
<wsdl:portType name="ServiceName">
<wsdl:operation name="execute">
<wsdl:input message="tns:execute" name="execute">
</wsdl:input>
<wsdl:output message="tns:executeResponse" name="executeResponse">
</wsdl:output>
</wsdl:operation>
</wsdl:portType>
更改在 portType 输入消息中。它从 "executeRequest" 重命名为 "execute"。
我不明白为什么这会改变或如何在 java 课程中更正它。所有注释似乎都是正确的。
似乎缺少 "Request" 后缀是 CXF 的一个特性而不是错误。我需要做的是更新我的客户端或实施服务器端拦截器:
http://cxf.apache.org/docs/interceptors.html
这个:
您将需要子类化 org.apache.cxf.service.factory.DefaultServiceConfiguration 并重写 getInputMessageName 方法以将 QName 附加到 "Request"。然后,您将必须配置 CXF 以将服务配置指向您的子类
如果我能弄清楚如何去做,这似乎也是一个很好的解决方案。