简而言之,我希望实现的是运行wsdl2java并生成额外代码的能力。有没有人这样做并且可以提供提示/提示/建议,有没有人用不同的方法完成任何类似的事情(问题进一步向下)?
长篇:
背景
我们有一个第三方软件,在许多项目中广泛使用,但它无法直接与Web服务集成。考虑到这一点,我们采用wsdl,生成客户端,然后有许多样板代码位于顶部以允许集成。我已经花了一些时间来填补这个但是我想要全力以赴。
目前的地位:
我编写了一个简单的第一代代码生成器,它处理95%的代码创建但是这是在手写的xml配置中读取,使用FileWriter(eugh)输出代码,但我仍然需要手写绑定它的代码将信息传递给实际的Web服务客户端代码。这只是一个快速而肮脏的解决方案,因为我需要它快速,并且还充当POC。
解决此问题的方法: 我在自己的时间里选择这个,纯粹是因为我认为这是一个有趣的问题但是我不想在死胡同的方法上浪费很多。
我相信实现我的目标的方法是编写代码生成模块的扩展,如此处所述http://wso2.org/library/35,我相信通过编写此扩展我将可以访问wsdl的轴模型并且可以应用我自己的xslt。
如果您同意并做了类似的事情,是否有任何您需要分享的建议,或者您可以指出的有用资源。
如果你不同意我的方法,我会很欣赏一个简短的大纲(不想浪费你的时间),为什么和建议一个新的approch。
答案 0 :(得分:0)
我从未扩展过Axis2 WSDL2Java发射器,所以我不知道你会从中获得多大的灵活性。您引用的文章表明您可以非常轻松地进入生成过程。这实际上取决于你必须生成什么。 最近我不得不从数据库模式和WSDL创建样板代码,我使用了混合方法:
Groovy非常适合快速原型设计和模板。例如,您可以从数据库或Wsdl收集信息,并根据模板发出代码。在这里,您可以看到一些示例:http://groovy.codehaus.org/Groovy+Templates
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代码。
希望这有帮助!
答案 1 :(得分:0)
您已经开始编写代码生成器来实现目标,因此您可以尝试继续这条路径。 codemodel库是一个非常棒的库,用于生成代码。我刚刚用它来生成代码,非常好。
我建议您尝试使用此代码模型库来生成所需的代码。这是为jaxb wsdl编写的用于java编译器的codemodel库。
答案 2 :(得分:0)
我们经常使用wsdl2java(但在1.4版本中)我的唯一提示是:
1使用复杂/结构化类型作为操作的参数,例如resetWidget(widgetStruct)其中widgetStruct类包含字段widgetId,widgetName,widgetType等而不是resetWidget(arg1,arg2,arg3 ..)。因此,明年当您扩展WSDL并添加更多参数时,所有遗留代码仍然可以编译而无需扩展所有方法。这种方法实际上是强加于我们的,因为如果我们将所有字段作为params传递,则另一个(旧的)WSDL工具没有正确生成响应。
2将所有业务逻辑放入其他类中。因此,当您重新生成骨架时,您可以放回几行代码,而不必更新大量代码。
在Axis2中可能解决了其中一些问题。
答案 3 :(得分:0)
进一步的研究表明,要走的路是创建一个基于AxisServiceBasedMultiLanguageEmitter的新CodeEmitter。
不幸的是,这个项目是固定的,因为不再需要创建Web服务客户端。第三方软件发布了一个新版本,允许它直接使用Web服务。