Customizations for WCF Service WSDL

针对WCF Service WSDL,记录下我的一些使用体验:

1.根据WCF Service WSDL生产client端java代码可能会有JAXBElement<T>这样的properties,JAXB2.0 建议通过一些定制可生成一些对java更友好的代码,详细文档请看 这里

我的步骤如下:
#1.创建一个txt文本(暂命名为“bindings.txt”),如下:
<jaxb:bindings version="2.1" xmlns:jaxb="http://java.sun.com/xml/ns/jaxb"
xmlns:xjc="http://java.sun.com/xml/ns/jaxb/xjc"
xmlns:xs="http://www.w3.org/2001/XMLSchema">
<jaxb:globalBindings generateElementProperty="false"/>
</jaxb:bindings>


#2.使用以下命令行生产java客户端代码:
wsdl2java -p your.package -b bindings.txt yourdownloaded.wsdl

Or

wsimport -p your.package -b bindings.txt -keep yourdownloaded.wsdl

注意这里使用了“-b bindings.txt”来添加一些额外定制。

#3.这样生成的client代码可获得对java更友好的支持。

2.在XML节点和java objects之间进行unmarshal的时候,针对从xml文件到java objects无法成功解组时,获得的都是null,如果你觉得你的XML文件格式都是正确的前提下,检查下你生成的客户端代码文件“package-info.java”,其中你可能会遇到如下代码:

@javax.xml.bind.annotation.XmlSchema(namespace = "http://www.vuebill.com/WebService/2/", elementFormDefault = javax.xml.bind.annotation.XmlNsForm.QUALIFIED)


请留意下elementFormDefault属性,elementFormDefault属性用来设置xml的实例中子元素是否一定需要有命名空间限定,对于xml<-->java objects之间的转换时,很有可能使用了命名空间从而影响xml节点的映射,可以尝试将“package-info.java”elementFormDefault相关的值移除,再尝试unmarshal。

(以上纯属个人经历,只是希望可以多注意下package-info.java这个文件)

3.JAXB unmarshalling exception : unexpected element
可尝试检查具体对应生成的java client object代码,在对应的@XmlRootElement、@XmlElement 添加namespace来具体指明你的namespace,如下:

@XmlElement(name="your xml node name", namespace="http://your name space")


Good luck!

小结:
调用.Net提供的webservice,会遇到一些关于WSDL、导入xsd文件、生成客户端代码等等问题,由于本身语言方面的各种问题,需要更多一点的耐心。

suds是一个不错的lightweight soap-based web service client(python),其中可以不用生成客户端代码我觉得非常好用,而且使用也很方便,推荐喜欢python的朋友试试!

你可能感兴趣的:(java,xml,webservice,python,WCF)