jaxb2-maven-plugin绑定dc:date为LocalDateTime提示未定义的解决办法
解决JAXB绑定dc:date到LocalDateTime时的类型未定义错误
问题原因
你遇到的报错是因为{http://purl.org/dc/terms}date并不是一个自定义简单类型——dc.xsd中的<dc:date>元素实际使用的是标准XML Schema的xsd:date类型,而非dc命名空间下的自定义类型。你直接在绑定文件中引用dc命名空间的date类型,JAXB无法识别,因此抛出未定义类型的异常。
解决方案
方案1:全局绑定标准xsd:date类型(推荐)
直接对所有使用xsd:date类型的元素(包括<dc:date>)配置全局类型映射,无需单独处理dc的元素:
修改你的binding.xjb文件:
<jaxb:bindings xmlns:jaxb="http://java.sun.com/xml/ns/jaxb" xmlns:xsd="http://www.w3.org/2001/XMLSchema" jaxb:version="2.1"> <jaxb:globalBindings> <!-- 将所有xsd:date类型映射为LocalDateTime,使用自定义适配器 --> <jaxb:javaType name="java.time.LocalDateTime" xmlType="xsd:date" parseMethod="com.yourpackage.XmlDateAdapter.unmarshal" printMethod="com.yourpackage.XmlDateAdapter.marshal"/> </jaxb:globalBindings> <!-- 绑定你自己的业务XSD --> <jaxb:bindings schemaLocation="your-business.xsd"/> </jaxb:bindings>
方案2:单独绑定dc:date元素
如果只想针对<dc:date>元素做映射,需要先导入dc的XSD文件,再定位到该元素进行绑定:
<jaxb:bindings xmlns:jaxb="http://java.sun.com/xml/ns/jaxb" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:dc="http://purl.org/dc/terms" jaxb:version="2.1"> <!-- 导入dc的XSD,让JAXB识别dc命名空间的元素 --> <!-- 可以用网络地址,也可以下载到本地用相对路径,比如./dc.xsd --> <jaxb:bindings schemaLocation="http://purl.org/dc/terms/dc.xsd"> <!-- 定位到dc:date元素并配置类型映射 --> <jaxb:bindings node="//xsd:element[@name='date']"> <jaxb:javaType name="java.time.LocalDateTime" parseMethod="com.yourpackage.XmlDateAdapter.unmarshal" printMethod="com.yourpackage.XmlDateAdapter.marshal"/> </jaxb:bindings> </jaxb:bindings> <!-- 绑定你自己的业务XSD --> <jaxb:bindings schemaLocation="your-business.xsd"/> </jaxb:bindings>
方案3:确保自定义适配器正确处理类型转换
由于xsd:date仅包含年月日,而LocalDateTime包含时分秒,你的适配器需要处理两者的转换逻辑:
package com.yourpackage; import jakarta.xml.bind.annotation.adapters.XmlAdapter; import java.time.LocalDate; import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; public class XmlDateAdapter extends XmlAdapter<String, LocalDateTime> { private static final DateTimeFormatter DATE_FORMATTER = DateTimeFormatter.ISO_LOCAL_DATE; @Override public LocalDateTime unmarshal(String dateStr) { // 将xsd:date字符串(如"2024-05-20")转换为LocalDateTime,时分秒设为当天起始 LocalDate localDate = LocalDate.parse(dateStr, DATE_FORMATTER); return localDate.atStartOfDay(); } @Override public String marshal(LocalDateTime dateTime) { // 将LocalDateTime转换为xsd:date格式的字符串,仅保留年月日部分 return dateTime.format(DATE_FORMATTER); } }
验证Maven插件配置
确保你的Maven JAXB插件正确指定了绑定文件:
<plugin> <groupId>org.jvnet.jaxb2.maven2</groupId> <artifactId>maven-jaxb2-plugin</artifactId> <version>0.14.0</version> <executions> <execution> <goals> <goal>generate</goal> </goals> <configuration> <schemaDirectory>src/main/resources</schemaDirectory> <bindingDirectory>src/main/resources</bindingDirectory> <bindingIncludes> <include>binding.xjb</include> </bindingIncludes> </configuration> </execution> </executions> </plugin>
内容的提问来源于stack exchange,提问作者Cedric Mouton
相关产品推荐
相关产品推荐

