gpt4 book ai didi

java - 如何让 jaxb 插件使用 OffsetDateTime

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:49:29 26 4
gpt4 key购买 nike

我们有一个带有 xs:dateTime 字段的 xsd。这是我们内部的内部 API,我们可以保证始终包含偏移量数据,因此它与 ISO-8601 兼容。例如:

2016-01-01T00:00:00.000+01:00

目前,jaxb2 插件将 xs:dateTime 映射到 XMLGregorianCalendar 类型的字段。如何配置插件,使其使用 OffsetDateTime

我不关心解决方案是针对maven-jaxb2-pluginjaxb2-maven-plugin 还是cxf-codegen-plugin,我们将使用任何有效的方法。

最佳答案

您可以将 jaxb2-maven-pluginjaxb-bindings 文件一起使用。

首先我创建了一个 odt.xsd 文件:

<?xml version="1.0" encoding="UTF-8"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<xsd:element name="teste" type="Teste" />
<xsd:complexType name="Teste">
<xsd:sequence>
<xsd:element name="date" type="xsd:dateTime" minOccurs="1"
maxOccurs="1" nillable="false"/>
</xsd:sequence>
</xsd:complexType>
</xsd:schema>

然后我创建了一个 jaxb-bindings.xjb 文件,它定义了 date 字段的类型,以及与之相互转换的类:

<jaxb:bindings xmlns:jaxb="http://java.sun.com/xml/ns/jaxb" xmlns:xsd="http://www.w3.org/2001/XMLSchema" jaxb:version="2.0">
<jaxb:bindings schemaLocation="odt.xsd">
<jaxb:bindings node="//xsd:element[@name='date']">
<jaxb:javaType name="java.time.OffsetDateTime"
parseMethod="xsd.test.OffsetDateTimeAdapter.parse"
printMethod="xsd.test.OffsetDateTimeAdapter.print" />
</jaxb:bindings>
<jaxb:schemaBindings>
<jaxb:package name="xsd.test" />
</jaxb:schemaBindings>
</jaxb:bindings>
</jaxb:bindings>

此文件引用了 xsd.test.OffsetDateTimeAdapter 类以及将 OffsetDateTimeString 相互转换的相应方法,因此我还创建了它:

package xsd.test;

import java.time.OffsetDateTime;

public class OffsetDateTimeAdapter {

public static OffsetDateTime parse(String value) {
return OffsetDateTime.parse(value);
}

public static String print(OffsetDateTime value) {
return value.toString();
}
}

然后,在 pom.xml 中,我添加了插件的配置:

<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>jaxb2-maven-plugin</artifactId>
<executions>
<execution>
<id>xjc</id>
<goals>
<goal>xjc</goal>
</goals>
</execution>
</executions>
<configuration>
<!-- The package of your generated sources -->
<packageName>xsd.test</packageName>
<sources>
<source>src/main/resources/odt.xsd</source>
</sources>
<xjbSources>
<xjbSource>src/main/resources/jaxb-bindings.xjb</xjbSource>
</xjbSources>
</configuration>
</plugin>

有了这个,我刚刚用 mvn clean package 构建了项目,创建的 jar 包含 xsd.test 包中生成的文件。 Teste 类包含 date 字段作为 OffsetDateTime:

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "Teste", propOrder = {
"date"
})
public class Teste {

@XmlElement(required = true, type = String.class)
@XmlJavaTypeAdapter(Adapter1 .class)
@XmlSchemaType(name = "dateTime")
protected OffsetDateTime date;
// getter and setter
}

有了这个,date 字段被映射到一个 OffsetDateTime,使用自动生成的 Adapter1(它在内部使用 xsd.上面创建的 test.OffsetDateTimeAdapter 类)。从 xml 解析日期的示例:

ObjectFactory f = new ObjectFactory();
JAXBContext context = JAXBContext.newInstance("xsd.test");
Unmarshaller unmarshaller = context.createUnmarshaller();
String xml = "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?><ns2:teste xmlns:ns2=\"xsd.test\"><date>2016-01-01T00:00+01:00</date></ns2:teste>";
JAXBElement<Teste> jaxElement = unmarshaller.unmarshal(new StreamSource(new ByteArrayInputStream(xml.getBytes())), Teste.class);
OffsetDateTime odt = jaxElement.getValue().getDate();
System.out.println(odt); // 2016-01-01T00:00+01:00

当将日期编码为 xml 时,OffsetDateTime 直接转换为 String,例如 2016-01-01T00:00+01:00


另一种方式是使用JDK自带的命令行xjc:

xjc src/main/resources/odt.xsd -d src/main/java/ -p xsd.test -b src/main/resources/jaxb-bindings.xjb

这会在 src/main/java 目录中生成类,在 xsd.test 包中。

关于java - 如何让 jaxb 插件使用 OffsetDateTime,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46151312/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com