Parsing Soap dates in Jax-WS Client
我正在使用 Jax-WS 访问 SOAP 服务,但我在使用一种数据类型时遇到了困难:
1 2 3 4 5 6 7 8 9 10 | <xs:complexType name="OurDateType"> <xs:sequence> <xs:element name="Day" type="xs:gDay" minOccurs="0"> </xs:element> <xs:element name="Month" type="xs:gMonth"> </xs:element> <xs:element name="Year" type="xs:gYear"> </xs:element> </xs:sequence> </xs:complexType> |
客户端Stubbing是自动生成的,它为
1 2 3 4 5 6 7 8 9 10 | public class OurDateType { @XmlElement(name ="Day") @XmlSchemaType(name ="gDay") protected XMLGregorianCalendar day; @XmlElement(name ="Month", required = true) @XmlSchemaType(name ="gMonth") protected XMLGregorianCalendar month; @XmlElement(name ="Year", required = true) @XmlSchemaType(name ="gYear") protected XMLGregorianCalendar year; |
SOAP 调用未能从返回的 XML 中解组此结构:
1 2 3 4 | <TheDate xsi:type="ns1:OurDateType"> <Month xsi:type="xsd:gMonth">10</Month> <Year xsi:type="xsd:gYear">2011</Year> </TheDate> |
错误是
我已尝试创建一个
是否可以覆盖代码生成并提供我自己的类来捕获这种类型,或者以知道原始 XML 模式类型的方式覆盖解组?我更改版本的能力有限,因为该代码还可以作为其他三个 SOAP 服务的客户端,并为其自己的客户端提供 SOAP 服务。
供参考,这里是代码生成的配置:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | <plugin> <groupId>org.jvnet.jax-ws-commons</groupId> jaxws-maven-plugin</artifactId> <version>2.1</version> <executions> <execution> <goals> <goal>wsimport</goal> </goals> </execution> </executions> <configuration> <xadditionalHeaders>true</xadditionalHeaders> <verbose>true</verbose> <sourceDestDir>${project.build.directory}/generated-sources/jaxws/wsimport</sourceDestDir> <staleFile>${project.build.directory}/generated-sources/jaxws/wsimport/stale/.staleFlag</staleFile> <wsdlDirectory>${basedir}/src/main/resources/wsdl</wsdlDirectory> <sei/> </configuration> </plugin> |
我自己回答了这个问题,从不同的方向搜索。可以使用 JAXB 绑定文件覆盖生成的代码。
中找到的带有
我已经放弃了 XmlGregorianCalendar,而是将每个日期元素解析为一个单独的整数。这适用于我的服务,但需要一个自定义解析器来处理一些允许的日期字段变体。
我使用的绑定文件是这样的:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | <globalBindings> <javaType name="java.lang.Integer" xmlType="xs:gDay" parseMethod="javax.xml.bind.DatatypeConverter.parseInt" printMethod="javax.xml.bind.DatatypeConverter.printInt" /> <javaType name="java.lang.Integer" xmlType="xs:gMonth" parseMethod="javax.xml.bind.DatatypeConverter.parseInt" printMethod="javax.xml.bind.DatatypeConverter.printInt" /> <javaType name="java.lang.Integer" xmlType="xs:gYear" parseMethod="javax.xml.bind.DatatypeConverter.parseInt" printMethod="javax.xml.bind.DatatypeConverter.printInt" /> </globalBindings> </bindings> |