Axis2 Web 服务,自下而上的方法,复杂对象



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

我知道当我将方法公开为 Web 服务时,axis2 将尝试在 wsdl 文件中为我生成架构,并且我可以通过访问 Web 服务 url 并将 ?wsdl 附加到它的末尾来获取 wsdl 文件。

但仔细检查后,参数中复杂类型的某些属性在生成的 wsdl 的架构部分中表示为 xs:anyType。转换为 xs:anyType 的属性是一个列表。这样做的坏处是,当我为客户端代码生成存根代码时,设置该特定属性的方法签名将采用对象作为参数,即 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 的 JAX-WS 部分

最后我自己解决了这个问题。我使用 wsdl 为服务器端生成了存根代码,修改 messageReceiver 以改用生成的消息接收器,编写一个实现生成接口的包装类,编写一个转换器以在将向我的内部类型公开的包装类方法的参数中转换生成的类型的对象,并公开包装类。

最新更新