将WSDL转换为Java还是将Java转换为WSDL?

8
我最近接手了一个项目,其中构建过程相当复杂。手工编写的XSD模式由JAXB读取,生成Java类和工厂模型,这些模型被手工编写的Java Web服务类(带注释)使用,然后部署到服务器上。在此基础上,从服务器中读取完整的WSDL以生成第二个基于Java的模型,包括完整的WSDL服务和工厂类,这些类用于客户端程序。
这听起来很糟糕,我认为不需要这么复杂,因此我想在某个阶段放弃所有这些,要么:
- 手工编写WSDL,生成完整的模型并添加服务代码。 - 或者,在运行时在服务器上编写服务和模型类,并根据需要生成WSDL。
无论哪种方式,我都希望最终得到一个源代码库,供服务器和客户端使用,并且对于模型应该是一个“真实来源”,而不是目前我感觉有几个来源。
目前我倾向于第二个选项,但你会选择哪个?你会使用哪些技术?
7个回答

8
在我正在从事的项目中,我们正在完全重新设计我们的Web服务。这些服务通过SOAP向客户端提供服务器功能。从我研究该协议的所有复杂性所学到的内容来看,这极大地影响了WSDL的布局,因此我不想自己编写WSDL。有很多事情你可能会做错(特别是当涉及到参数样式等问题时)。而且一旦你的WSDL“出现在外面”,并且从那个WSDL生成的客户端正在与你的应用程序愉快地通信,你就不能再次更改它(或者你开始考虑一个版本控制策略,这也可能非常痛苦)。
因此,我强烈建议您使用Java编写您的服务代码,并让您的库为您生成一个WSDL。然后,您可以非常容易地尝试不同的绑定样式(这反过来又影响与其他客户端的互操作性)。可以在这里找到一篇非常详尽的文章来描述所有这些:

http://www.ibm.com/developerworks/webservices/library/ws-whichwsdl/

此外,WSDL对于人类来说并不是特别易读,因此(至少在我看来)更难由人类维护。另一方面,Java代码相当容易阅读(或者至少你可以这样编写),这是手工制作Java代码而不是WSDL的更好理由。希望这能帮助您做出决定。

1
我认为随着Web服务框架的出现,人们不应该再需要阅读或编辑WSDL。编写你的Web服务代码以及输入和输出数据结构。使用工具/框架从这些代码生成WSDL(我使用Apache-CXF)。在另一方面,客户端使用工具/框架从发布的WSDL生成他们的代码。 - CodeClimber

5
最干净的方法是手动生成WSDL或使用设计工具 - 然后从中生成代理和存根。
这种方式背后的逻辑是,WSDL定义了服务合同,应该与实现无关 - 而Java类是特定于实现的 - 这些实现细节通常被传递到WSDL中。
确切的问题取决于您使用的Java到WSDL转换器(或更重要的是,Java到XSD转换器)- 但它们非常普遍,特别是如果您计划在环境中添加非Java服务器或客户端。
如果您喜欢用Java编写服务,您应该遵循一些指导方针,以最小化实现锁定,例如:
- 控制从类到XSD的转换(我相信可以使用注释来完成) - 仅使用简单类型和简单类型的聚合作为参数(不要将常规类作为参数传递)

4
我本以为通过简单的HTTP GET进程(手动或通过简单的代码调用(ant任务等))即可检索wsdls和模式,而不是您描述的那种复杂过程。话虽如此,我通常处理具有发布周期的Web服务,因此通常会手动获取wsdls和模式。
如果您必须在每次构建时重新获取wsdls和模式,我倾向于将获取进程放入构建中作为预备步骤(在maven中,它将是阶段,并且我将考虑使用GET ant task),然后进行wsdl2java步骤(在maven中,我通常将wsdl2java ant任务连接到阶段)。

2

最近我学习了一种自动生成Java类的方法,使用了Apache cxf项目中的wsdl2java.bat。具体信息可以访问http://cxf.apache.org/

对于集合(collections)部分,我使用了XmlElementWrapper进行了一些小修改,并且修复了一些命名空间相关问题,但是其他都很顺利。


2
一旦你记住了web服务Java是完全不同的东西,这种方法就会有些意义。
鉴于这个前提,手写XSD的原因是为了避免Java类型对方法参数的污染。这个问题从一开始就存在。
问题有两个方面:类型定义和语言限制。由JAX-RPC类型Web服务生成的类型不适合许多非Java消费者使用。Java团队在不断努力解决这个问题,我认为其中一个问题在JAX-WS中已经得到了很大的规避。将Web服务定义在编程语言之外的尝试(XML 一种语言)是手写数据定义的原因。
WSDL生成很难,正如许多人指出的那样,最好使用工具或IDE生成WSDL - 这样,传输就不再是问题了。这样,XSDs就被包含在您的WSDL中,而且由于您“手动编写”了XSDs,所以您可以控制自己的内容。

嗨,我不确定我理解你关于污染的评论。我已经搜索过了,但没有找到任何解释它的东西。你能给一些细节吗? - drekka
@Derek,我写的是基于自己开发Web服务的个人经验,早在jdk5之前就开始了。这里有一个链接指出一些区别,我会编辑我的答案并提供更多细节。http://www.ibm.com/developerworks/webservices/library/ws-tip-jaxwsrpc2.html - CMR
嗨,我刚刚读完了这篇文章,但是对于方法参数的污染问题并没有更多的了解。你是指在提供Web服务的方法中应用于方法参数的注释吗?例如EJB 3 bean。我想知道这是否是我以前没有遇到过或者只是我没有认出来的问题 :-) - drekka
1
@Derek,你会如何表示电话号码?邮政编码呢?如果你说整数类型,根据某些思想流派,你已经把语言特定的类型应用于概念对象。将它们表示为它们本身的类型:邮政编码和电话号码。 - CMR

2
一种方法是使用XML Schema(XSD)来定义模型。一旦定义了此模型,您可以定义服务接口(WSDL),这些接口将使用模型(XSD)中的对象作为服务的输入/输出。
这定义了您的抽象服务和模型层。
然后,您可以使用自己喜欢的工具和技术开发具体实现。您甚至可以使用jAXB来定义XSD模型库的Java等效项,并在客户端和服务器中使用它。 http://buddhiraju.wordpress.com - 有关SOA、XML、集成和相关主题的博客

1

我真的很喜欢Spring-WS。它采用了基于契约的方法。为什么要基于契约?

你定义你的XML Schema,然后Spring会为你生成WSDL。它隐藏了WSDL的技术细节,非常简洁。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接