【问题标题】:Extending Axis Code Generation module扩展轴代码生成模块
【发布时间】:2011-05-08 23:29:46
【问题描述】:

简而言之,我希望实现的是运行 wsdl2java 并生成额外代码的能力。有没有人这样做并且可以提供提示/提示/建议,有没有人用不同的方法做了类似的事情,在问题的更下方(更进一步)?

长格式:

背景:

我们有一个在许多项目中广泛使用的第三方软件,但它无法直接与 Web 服务集成。考虑到这一点,我们采用 wsdl,生成客户端,然后在顶部放置大量样板代码以允许集成。我花了一些时间流式处理这个,但我想全力以赴。

当前地位:

我已经编写了一个简单的第一代代码生成器,它可以处理 95% 的代码的创建,但是这是在手写的 xml 配置中读取的,使用 FileWriter(eugh) 输出代码,但我仍然需要手写绑定它的代码将信息传递给/来自实际的 Web 服务客户端代码。这只是一个快速而肮脏的解决方案,因为我需要它快速,并且还可以充当 POC。

解决方法: 我在自己的时间里选择这个纯粹是因为我认为这是一个有趣的问题,但因此我不想在死胡同上浪费很多时间。

我相信实现我的目标的方法是编写代码生成模块的扩展,如此处所述http://wso2.org/library/35,我相信通过编写此扩展,我将可以访问 wsdl 的轴模型并且可以应用我自己的xslt 到它。

如果您同意并做过类似的事情,您是否愿意分享任何建议,或者您可以指出有用的资源。

如果您不同意我的方法,我会感谢您简要说明原因(不想浪费您的时间)以及对新方法的建议。

【问题讨论】:

    标签: java templates code-generation axis2


    【解决方案1】:

    我从未扩展过 Axis2 WSDL2Java 发射器,所以我不知道这样做会获得多大的灵活性。您引用的文章表明您可以很容易地进入生成过程。这实际上取决于您必须生成什么。 最近我不得不从数据库模式和 WSDL 创建样板代码,并且我使用了一种混合方法:

    • 时髦的

    Groovy 非常适合快速制作原型和模板。例如,您可以从数据库或 Wsdl 收集信息并基于模板发出代码。在这里你可以看到一些例子:http://groovy.codehaus.org/Groovy+Templates

    • PMD API

    PMD 是一个扫描 Java 代码并报告潜在问题的工具。它还公开了一个使用 XPATH 解析代码的 API,并且有一个非常丰富的模型可供使用。您可以执行以下操作:

    final Java15Parser parser = new Java15Parser();
    final FileInputStream stream = new FileInputStream("VehicleServiceType.java");
    
    final Object c = parser.parse(new InputStreamReader(stream));
    
    final XPath xpath = new BaseXPath("//TypeDeclaration/Annotation/NormalAnnotation[Name/@Image = 'WebService']",
            new DocumentNavigator());
    
    for (final Iterator iter = xpath.selectNodes(c).iterator(); iter.hasNext();) {
       final Object obj = iter.next();
          // Do code generation based on annotations...
    }
    

    就我个人而言,我发现混合方法比单一方法效果更好。代码生成通常是一门艺术而不是一门科学。 还有一件事:在我当前的项目中,我正在使用 Python 进行(简单)代码生成。它有一个非常好的模板库 (jinja),但我不推荐它来解析 Java 代码。

    希望对您有所帮助!

    【讨论】:

      【解决方案2】:

      您已经开始编写代码生成器来实现您的目标,因此您可以尝试继续走这条路。 codemodel 库是一个非常棒的用于生成代码的库。最近刚用它来生成代码,效果很好。

      我建议您尝试使用此代码模型库来生成您需要的代码。这是为jaxb wsdl to java编译器编写的codemodel库。

      【讨论】:

      • 谢谢,我去看看。
      【解决方案3】:

      我们经常使用 wsdl2java(但在轴 1.4 中)我唯一的提示是:

      1 使用复杂/结构化类型作为操作的参数,例如resetWidget(widgetStruct) 其中 widgetStruct 类包含字段 widgetId、widgetName、widgetType 等,而不是 resetWidget(arg1, arg2, arg3..)。因此,明年当您扩展 WSDL 并添加更多参数时,所有遗留代码仍然可以编译,而无需扩展您的所有方法。这种方法实际上是强加给我们的,因为如果我们将所有字段作为参数传递,另一个(旧)WSDL 工具无法正确生成响应。

      2 将所有业务逻辑放入其他类。因此,当您重新生成骨架时,您只需将几行代码放回去,而不必更新大量代码。

      也许其中一些问题在 Axis2 中得到了解决。

      【讨论】:

      • 我很欣赏这个答案,我可能会误读它,但听起来你使用的是 wsdl2java,实际上你并没有扩展它的代码生成功能来做更多的事情,而不仅仅是生成骨架。
      【解决方案4】:

      进一步的研究表明,要走的路是创建一个基于 AxisServiceBasedMultiLanguageEmitter 的新 CodeEmitter。

      不幸的是,由于不再需要创建 Web 服务客户端,因此该项目被终止了。第三方软件发布了一个新版本,允许它直接使用网络服务。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-12-19
        • 1970-01-01
        • 2011-10-05
        • 2010-12-20
        • 2016-01-15
        • 1970-01-01
        • 1970-01-01
        • 2022-11-10
        相关资源
        最近更新 更多