【发布时间】:2021-08-05 06:32:51
【问题描述】:
我正在尝试将现有应用程序从 Java 1.8 迁移到 11,在应用程序中,我们使用此插件从 xsd 生成源代码:
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>jaxb2-maven-plugin</artifactId>
<version>${maven.jaxb.plugin.version}</version>
<dependencies>
<dependency>
<groupId>com.sun.xml.bind</groupId>
<artifactId>jaxb-impl</artifactId>
<version>${jaxb.impl.version}</version>
</dependency>
<dependency>
<groupId>javax.xml.bind</groupId>
<artifactId>jaxb-api</artifactId>
<version>${jaxb.api.version}</version>
</dependency>
<dependency>
<groupId>com.sun.xml.bind</groupId>
<artifactId>jaxb-xjc</artifactId>
<version>${jaxb.xjc.version}</version>
</dependency>
<dependency>
<groupId>jakarta.xml.bind</groupId>
<artifactId>jakarta.xml.bind-api</artifactId>
<version>${jakarta-xml-api.version}</version>
</dependency>
</dependencies>
<executions>
<execution>
<id>horas</id>
<phase>generate-sources</phase>
<goals>
<goal>xjc</goal>
</goals>
<configuration>
<encoding>utf-8</encoding>
<quiet>true</quiet>
<packageName>client.model</packageName>
<schemaDirectory>${basedir}/src/main/config/xsd</schemaDirectory>
<bindingDirectory>${basedir}/src/main/config/xsd</bindingDirectory>
<bindingFiles>bindings.xjb</bindingFiles>
<extension>true</extension>
<clearOutputDir>true</clearOutputDir>
<schemaFiles>model.xsd</schemaFiles>
</configuration>
</execution>
</executions>
</plugin>
在 xsd 中我们使用类型
<xs:simpleType name="dateTime" id="dateTime">
<xs:annotation>
<xs:appinfo>
<hfp:hasFacet name="pattern"/>
<hfp:hasFacet name="enumeration"/>
<hfp:hasFacet name="whiteSpace"/>
<hfp:hasFacet name="maxInclusive"/>
<hfp:hasFacet name="maxExclusive"/>
<hfp:hasFacet name="minInclusive"/>
<hfp:hasFacet name="minExclusive"/>
<hfp:hasProperty name="ordered" value="partial"/>
<hfp:hasProperty name="bounded" value="false"/>
<hfp:hasProperty name="cardinality"
value="countably infinite"/>
<hfp:hasProperty name="numeric" value="false"/>
</xs:appinfo>
<xs:documentation
source="http://www.w3.org/TR/xmlschema-2/#dateTime"/>
</xs:annotation>
<xs:restriction base="xs:anySimpleType">
<xs:whiteSpace value="collapse" fixed="true"
id="dateTime.whiteSpace"/>
</xs:restriction>
</xs:simpleType>
为了翻译日期,我们有这个绑定:
<?xml version="1.0"?>
<jxb:bindings version="1.0"
xmlns:jxb="http://java.sun.com/xml/ns/jaxb"
xmlns:xjc="http://java.sun.com/xml/ns/jaxb/xjc"
jxb:extensionBindingPrefixes="xjc"
xmlns:xs="http://www.w3.org/2001/XMLSchema">
<jxb:bindings schemaLocation="model.xsd" node="/xs:schema">
<jxb:globalBindings>
<xjc:javaType name="org.joda.time.DateTime"
xmlType="xs:dateTime"
adapter="client.adapter.JodaDateTimeAdapter"/>
<xjc:simple/>
</jxb:globalBindings>
</jxb:bindings>
</jxb:bindings>
使用简单的适配器
/**
* Class adapter afin de traiter les objets de type {@link org.joda.time.DateTime}
*/
public final class JodaDateTimeAdapter extends XmlAdapter<String, DateTime> {
/**
* Conversion d'une String représentant une date en objet {@link DateTime}
*
* @param value Une String représentant une date selon le pattern ISO8601
* @return Un objet {@link DateTime}
*/
@Override
public DateTime unmarshal(String value) {
return ISODateTimeFormat.dateTimeParser().parseDateTime(value);
}
/**
* Conversion d'un objet {@link DateTime} en string selon le pattern
*
* @param value {@link DateTime} à convertir
* @return Une String représentant une date selon le pattern ISO8601
*/
@Override
public String marshal(DateTime value) {
return ISODateTimeFormat.dateTime().print(value);
}
}
它在 1.8 中运行良好,但在使用 java 11 构建后,绑定似乎不再起作用,实际上,生成的类具有 XMLGregorianCalendar 而不是 joda.dateTime。
找到绑定文件是因为如果我在POM中更改路径,就会发生错误,所以这意味着绑定是好的,但是由于某种原因,jaxb忽略了它。
你知道应该改变什么才能再次拥有 joda.DateTime 吗?
【问题讨论】:
-
部分
jaxb代码已从 JDK 11 中删除。我看到您已经明确添加了它们,购买时您可能需要仔细检查 groupId 和 artifactId。此外,您可以检查mvn dependency:tree实际使用的 jaxb 是什么。另外,我建议使用 Java Time API 而不是 Joda Time。 -
我不知道你所说的“仔细检查 groupId 和 artifactId”是什么意思,你的意思是要确保我没有写错?如果是这样的话,它不应该在 1.8 中也不起作用吗?对于依赖树,我做到了,使用的 jaxb 是 com.sun.xml.bind:jaxb-impl:jar:2.2.5:compile, javax.xml.bind:jaxb-api:jar:2.2.5:compile和 com.sun.xml.bind:jaxb-xjc:jar:2.2.5:compile。考虑到日期,我同意你的看法,但即使改变它也不会改变构建结果,所以我更专注于让应用程序在 java 11 上运行。