2011-05-10 73 views
2

我正在使用axis2公开一个现有类的方法作为web服务(自下而上的方法)。该方法将一个复杂对象(非基本类型)作为参数,并返回一个复杂对象。Axis2 web服务,自下而上的方法,复杂的对象

我知道axis2会试图在wsdl文件中为我生成模式,当我将该方法作为Web服务公开时,我可以通过访问Web服务url并将?wsdl追加到末尾来获取wsdl文件的。

但仔细研究之后,参数中复杂类型的某些属性在结果wsdl的模式部分中表示为xs:anyType。转换为xs:anyType的属性是List。这样做的坏处是,当我为客户端代码生成存根代码时,设置该特定属性的方法签名会将一个对象作为参数,即setAttribute(Object obj)。

所以我的解决方案是使用JAXB 2.0来生成我需要的类的xml模式,然后将xsd导入由axis2生成的wsdl文件(从web服务url +?wsdl下载)并使用编辑后的wsdl而不是自动生成的wsdl。这个解决方案似乎对客户端来说工作得很好。用于设置由存根代码生成的属性的方法签名将采用适当的类型,即setAttribute(AnotherComplexType abcd)。通过使用tcpmon,我可以看到从客户端发送到服务器的xml似乎是正确的。

但是,这种方法对于服务器端来说效果不好,因为axis2不使用JAXB 2.0注释将接收到的xml转换回到暴露的方法能够处理的类中。

我的问题是,有无论如何解决我的问题?我可以想到的可能的方法是修改axis2在接收到xml后处理它的方式(如果确实有办法,我可以手动处理它),或者使axis2在JAXB 2.0注释中正常工作?或者,也许还有其他想法?

注:我没有使用Axis2

回答

1

在我解决了这个自己最终的JAX-WS的一部分。我使用wsdl生成服务器端的存根代码,修改messageReceivers以使用生成的消息接收器,编写一个实现生成的接口的包装类,编写一个转换器将对象从生成的类型转换为包装类的参数方法将暴露给我的内部类型,并暴露包装类。

+0

嗨你可以发布这个代码。我面临同样的问题 – samir 2016-01-13 15:04:03

+0

嗨,这是很久以前,我已经失去了所有这些旧数据 – Hery 2016-01-23 02:41:08