代码之家  ›  专栏  ›  技术社区  ›  Kevin D

扩展轴码生成模块

  •  4
  • Kevin D  · 技术社区  · 14 年前

    简而言之,我希望实现的是运行wsdl2java和生成额外代码的能力。有没有人这样做,并能提供提示/提示/建议,有没有人做过类似的事情,用不同的方法,一个大纲,进一步向下的问题(很多)?

    从长远来看:

    背景:

    我们有一个在许多项目中广泛使用的第三方软件,但它不能直接与web服务集成。考虑到这一点,我们采用wsdl,生成客户机,然后有很多样板代码放在上面以允许集成。我花了一些时间来处理这个问题,但我想全力以赴。

    当前状态:

    我已经编写了一个简单的第一代代码生成器,它处理95%的代码的创建,但是这是在一个手写的xml配置中读取的,使用FileWriter(eugh)输出代码,但是我仍然需要手工编写代码来将它与实际的webservice客户机代码相关联。这只是一个快速和肮脏的解决方案,因为我需要它快速,也作为一个POC。

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

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

    如果你同意并且做过类似的事情,有什么建议你愿意分享,或者有什么有用的资源可以告诉我。

    如果你不同意我的方法,我会很感激一个简短的提纲(不想浪费你的时间)为什么和建议一个新的方法。

    4 回复  |  直到 14 年前
        1
  •  0
  •   Luciano Fiandesio    14 年前

    我从来没有扩展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
  •  0
  •   Michael Wiles    14 年前

    您已经开始编写代码生成器以实现您的目的,因此可以尝试继续此路径。codemodel库是生成代码的非常棒的库。我最近刚刚用它来生成代码,它非常好。

    我建议您让这个代码模型库尝试生成您需要的代码。这是为jaxb wsdl编写的代码模型库。

        3
  •  0
  •   jqa    14 年前

    我们已经使用了很多WSDL2Java(但在轴1.4),我的唯一秘诀是:

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

    2把你所有的商业逻辑放到其他类中。因此,当你重新生成骨架时,你只需放回几行代码,而不必更新大块代码。

    也许这些问题在AxIS2中得到了解决。

        4
  •  0
  •   Kevin D    14 年前

    进一步的研究表明,这样做的方法是创建一个基于AxISService的多语言发射器的新的代码发射器。

    不幸的是,由于不再需要创建web服务客户端,这个项目被屏蔽了。第三方软件发布了一个新版本,允许它直接使用web服务。