如何为不同包或WSDL配置JAXB多日期时间解析方法?
按包名或WSDL为JAXB同类型元素配置多解析方法的方案
你的原配置是全局绑定所有xs:dateTime到同一个适配器,要实现分WSDL或包名指定不同解析方法,可通过以下两种方式修改配置:
1. 按WSDL(对应XMLSchema)单独配置
如果不同WSDL关联不同的XMLSchema文件,直接针对目标Schema配置专属规则即可,全局规则可作为兜底方案。
示例配置:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <jaxb:bindings 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" version="2.1"> <!-- 全局默认规则:没单独配置的dateTime都用这个 --> <jaxb:globalBindings generateElementProperty="false"> <jaxb:javaType name="java.util.Date" xmlType="xs:dateTime" parseMethod="com.utils.DefaultDateTimeAdapter.parseDateTime" printMethod="com.utils.DefaultDateTimeAdapter.printDateTime"/> <xjc:serializable uid="-1"/> </jaxb:globalBindings> <!-- 给OrderService对应的Schema配置专属解析器 --> <jaxb:bindings schemaLocation="http://example.com/schema/OrderService.xsd" node="/xs:schema"> <!-- 方式一:只给Order类型下的dateTime元素配置 --> <jaxb:bindings node="//xs:complexType[@name='Order']//xs:element[@type='xs:dateTime']"> <jaxb:javaType name="java.util.Date" parseMethod="com.utils.OrderDateTimeAdapter.parseDateTime" printMethod="com.utils.OrderDateTimeAdapter.printDateTimeWithZone"/> </jaxb:bindings> </jaxb:bindings> <!-- 给UserService对应的Schema配置另一个解析器 --> <jaxb:bindings schemaLocation="http://example.com/schema/UserService.xsd" node="/xs:schema"> <!-- 方式二:给整个Schema下的所有dateTime统一配置 --> <jaxb:globalBindings> <jaxb:javaType name="java.util.Date" xmlType="xs:dateTime" parseMethod="com.utils.UserDateTimeAdapter.parseDateTime" printMethod="com.utils.UserDateTimeAdapter.printDateTimeWithoutZone"/> </jaxb:globalBindings> </jaxb:bindings> </jaxb:bindings>
schemaLocation填目标WSDL关联的XMLSchema地址,本地路径或远程URL都可以- 可以选择单独配置某个元素,或者给整个Schema下的同类型元素统一配置
2. 按生成的Java包名配置
如果生成的Java类分属不同包,直接绑定到指定包,配置该包下的专属规则即可。
示例配置:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <jaxb:bindings 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" version="2.1"> <!-- 全局默认规则 --> <jaxb:globalBindings generateElementProperty="false"> <jaxb:javaType name="java.util.Date" xmlType="xs:dateTime" parseMethod="com.utils.DefaultDateTimeAdapter.parseDateTime" printMethod="com.utils.DefaultDateTimeAdapter.printDateTime"/> <xjc:serializable uid="-1"/> </jaxb:globalBindings> <!-- 给com.example.order包下的所有类配置专属解析器 --> <jaxb:bindings package-name="com.example.order"> <jaxb:globalBindings> <jaxb:javaType name="java.util.Date" xmlType="xs:dateTime" parseMethod="com.utils.OrderDateTimeAdapter.parseDateTime" printMethod="com.utils.OrderDateTimeAdapter.printDateTimeWithZone"/> </jaxb:globalBindings> </jaxb:bindings> <!-- 给com.example.user包下的所有类配置另一个解析器 --> <jaxb:bindings package-name="com.example.user"> <jaxb:globalBindings> <jaxb:javaType name="java.util.Date" xmlType="xs:dateTime" parseMethod="com.utils.UserDateTimeAdapter.parseDateTime" printMethod="com.utils.UserDateTimeAdapter.printDateTimeWithoutZone"/> </jaxb:globalBindings> </jaxb:bindings> </jaxb:bindings>
package-name填生成的Java类所在的包路径,该包下所有xs:dateTime都会用这里的适配器,覆盖全局规则- 要更精细控制的话,也可以在包绑定下通过
node定位到具体类或元素单独配置
关键注意点
- 优先级:局部配置(特定Schema/包/元素)会覆盖全局配置
- 适配器类必须存在,且
parseMethod和printMethod是静态方法:parseMethod接收String参数,返回目标Java类型(比如java.util.Date)printMethod接收目标Java类型参数,返回String
- 如果WSDL里有内嵌Schema,要调整
node路径来定位内嵌Schema,比如用node="//xs:schema"
内容的提问来源于stack exchange,提问作者Adam
相关产品推荐
相关产品推荐

