首页 > 解决方案 > 使用 apache cxf 和 maven 我得到的代码看起来不正确

问题描述

我有几个 WSDL 文件,用于生成客户端代码以使用 SOAP 与远程服务通信。生成的代码包括如下所示的一行:

public class AddProductService extends Service {

    static {
        URL url = null;
        try {
            url = new URL("file:/Users/developer/spg/spg-subman/SubscriptionManager/src/main/resources/wsdl/AddProduct.xml");

我已经删除了一些生成的代码,并且只包含了我认为损坏的行。

WSDL 文件位于项目中,src/main/resources/wsdl并且该目录将不存在于将部署此代码的位置。

我正在使用带有 maven 的 cxf-codegen-plugin 插件来生成此代码。

我有一些问题:

  1. 运行时是否需要 WSDL?
  2. 如果是这样,我可以将其复制到 jar 文件中并将上面的 URL 指向一个classpath:URL 吗?
  3. 我可以将 WSDL 文件复制到目标目录中,然后使用这些文件为客户端生成 java 代码吗?

标签: apachewsdlcxfgenerated-code

解决方案


我正在回答这个问题,因为我找到了答案,并且我看到很多人发布的代码片段显示了我遇到的相同问题,实际上 cxf 代码示例演示了相同的问题。我也有多个 wsdlf 文件,如何解决也不清楚。

解决此问题的元素是:

  <wsdlLocation>AddProduct.xml</wsdlLocation>

从我的角度来看,问题是标签 wsdlLocation 建议了一个路径,但这不是路径的条目,只要将 wsdl 包含在类路径中,您只需将 wsdl 文件名放在此处并在运行时将找到它的 jar 文件。

最后,在 cxf-codegen-plugin 文件的配置部分的 pom 中的节看起来像这样:

<configuration>
    <sourceRoot>${project.build.directory}/generated-sources/cxf</sourceRoot>
    <wsdlOptions>
        <wsdlOption>
            <wsdl>${basedir}/src/main/resources/wsdl/AddProduct.xml</wsdl>
            <extraargs>
                <extraarg>-client</extraarg>
            </extraargs>
            <wsdlLocation>AddProduct.xml</wsdlLocation>
        </wsdlOption>
   </wsdlOptions>
</configuration

这样做的结果是,在静态声明中,您最终会得到以下结果:

URL url = AddProductService.class.getResource("AddProduct.xml");

而不是这个:

 url = new URL("file:/Users/tonyg/App/MyManager/src/main/resources/wsdl/AddProduct.xml");

推荐阅读