2009-09-08 91 views
2

我遇到了问题。如何动态生成Web服务客户端

设在另一边,WSDL将永远改变,

例如,上descriped在WSDL文件中的阿瑟赛德Web服务具有唯一的方法, 但该方法可能会随时更改名称,今天调用methodABC(),明天将更改为methodDEFO()..

假设在JAVA中, 是否有无论如何,我可以动态生成Web服务客户端,而无需手动手动执行?我的意思是当我的应用程序仍在运行时,动态生成客户端。

或者我应该去看什么样的文章,因为我从互联网上做了很多搜索,找不到办法做到这一点。 。我想我可能需要创建自己的框架来处理它..但不知道从哪里开始。

回答

0

好,

有几个问题要问这一个:

1:请问你的应用程序“了解”实际也就是改变名称来在运行时方法的 ?

2 .:你在控制该网络服务吗?

3 .:您使用什么框架进行WS通信?

+0

不...我无法控制别人..这就是为什么我想创建一个动态的客户端发电机... 如果我可以控制另一端..我没有这样的问题。 .. 现在我使用的框架是asix2 – jojo 2009-09-08 15:10:16

+1

这是没有用的。方法名称更改后,存根很可能无法工作。是否有名称更改的模式?即您的应用程序可以从新的wsdl中猜测实际的方法名称是什么? – KB22 2009-09-08 15:13:17

-1

通常wsdl是类似于消费者和主机之间的契约的文件。如果这将发生动态变化,则需要了解此更改的动态消耗情况,而不是动态地使用该服务。

+0

嗯...我没有办法...我必须使用该wsdl文件...... 我认为应该有可能对我来说这样做.. coz文件中的方法名已经定义在WSDL文件,数据类型也在WSDL文件中定义... 我从某处知道应该使用哪种方法调用哪种方法........ – jojo 2009-09-08 15:12:43

+0

All things像返回类型一样,签名和方法名称都是用wsdl写的。我问这个问题的观点是,如果返回类型或签名更改为某个您没有的对象,那么您也需要生成它们,这将成为另一个开销。 如果您可以告诉确切的情况,可以达到更好的解决方案。 – Kalpak 2009-09-08 15:32:29

7

您可以使用任何WSDL-to-Java工具与Java Compiler API一起使用,将生成的类加载URLClassLoader,然后开始工作。相当多的工作,但不是很难,我会​​说。 (您可能会耗尽PermGen的空间,最终,虽然)。

但是,如果你的情况是现实的,最重要的问题将是如何生成的类,但为什么是Web服务的发布者在破解?

编辑:澄清“on crack”thingie。更改Web服务的界面(例如方法名称)意味着您必须猜想要调用哪个方法。如果在界面中只有一个方法,那么确定要调用哪个方法并不难,但仍然 - 如果突然出现两个方法会发生什么?

更改外部系统使用的服务的界面是一件非常大的事情,不应掉以轻心。它绝对应该是自动化的。这是一种代码味道,最有可能是无能,滥用药物和/或纯粹疯狂的迹象。

我意识到我的道德化这样并不能解决您的问题。我只希望你能说一个负责任的人理解一个不断改变它的接口的Web服务是一种可憎的事情,并且改变它会比改写代码更好。

+1

'在破解',大声笑 - 网络服务必须成为跆拳道的候选人,如果我见过一个... – 2009-09-08 15:24:25

+0

我很想+1这只是为了评论。 :) – Powerlord 2009-09-08 15:24:38

+0

+1对于“破解”评论的震撼价值 – Federer 2010-03-09 15:11:51

0

这种WSDL动态更改的Web服务不适合生成客户端绑定。

大多数Web服务堆栈都支持动态客户端的概念,您可以通过静态方式调用Web服务操作。

要挑选一个示例,请参阅Apache CXF dopcumentation的相关部分。

另一个例子是Spring-WS,它从来不使用WSDL生成的代码,而是以XML文档为中心。如果您的Web服务具有高度可变性,那么我会强烈推荐Spring-WS而不是更传统的JAX-WS生成的客户端。