我正在尝试使用 JAXB 上下文为我的 dto 在 java 中生成一个 xsd 模式,我设法做到了,但我的大部分 dto 使用 java.time.LocalDateTime 所以我需要实现一个适配器。我想出了如何通过 xjb 绑定来做到这一点。但是这个 xsd 的目的是从另一个项目中调用,我不想在每个项目中都复制相同的 xjb 文件。
我手动编写了这个 xsd,这是我的预期输出:
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
targetNamespace="your-target-namespace"
elementFormDefault="qualified"
xmlns="your-target-namespace"
xmlns:jaxb="http://java.sun.com/xml/ns/jaxb"
xmlns:xjc="http://java.sun.com/xml/ns/jaxb/xjc"
jaxb:version="2.0"
jaxb:extensionBindingPrefixes="xjc">
<xs:annotation>
<xs:appinfo>
<jaxb:globalBindings>
<xjc:javaType name="java.time.LocalDateTime" xmlType="xs:dateTime"
adapter="ar.org.hiba.adapter.LocalDateTimeAdapter"
/>
</jaxb:globalBindings>
</xs:appinfo>
</xs:annotation>
<xs:complexType name="propiedadDTO">
<xs:sequence/>
<xs:attribute name="aplicacion" type="xs:string"/>
<xs:attribute name="entorno" type="xs:string"/>
<xs:attribute name="estado" type="xs:string"/>
<xs:attribute name="fechaUltimaModificacion" type="xs:dateTime"/>
<xs:attribute name="nombre" type="xs:string"/>
<xs:attribute name="valor" type="xs:string"/>
</xs:complexType>
</xs:schema>
ar.org.hiba.adapter.LocalDateTimeAdapter是一个我不介意在每个项目中都有的类,所以这不会是一个问题。
使用此代码片段,我生成了一个没有全局绑定的模式:
JAXBContext context = JAXBContext.newInstance(PropiedadDTO.class);
SchemaOutputResolver sor = new OutputResolver();
context.generateSchema(sor);
PopiedadDTO.java:
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "propiedadDTO")
public class PropiedadDTO {
@XmlAttribute(name = "aplicacion")
protected String aplicacion;
@XmlAttribute(name = "entorno")
protected String entorno;
@XmlAttribute(name = "estado")
protected String estado;
@XmlAttribute(name = "fechaUltimaModificacion")
@XmlJavaTypeAdapter(LocalDateTimeAdapter.class)
@XmlSchemaType(name = "dateTime")
protected LocalDateTime fechaUltimaModificacion;
@XmlAttribute(name = "nombre")
protected String nombre;
@XmlAttribute(name = "valor")
protected String valor;
..getters and setters..
LocalDateTimeAdapter.java:
public class LocalDateTimeAdapter
extends XmlAdapter<String, LocalDateTime> {
@Override
public LocalDateTime unmarshal(String v) {
return LocalDateTime.parse(v);
}
@Override
public String marshal(LocalDateTime v) {
return v.toString();
}
}
输出是:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<xs:schema version="1.0" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:complexType name="propiedadDTO">
<xs:sequence/>
<xs:attribute name="aplicacion" type="xs:string"/>
<xs:attribute name="entorno" type="xs:string"/>
<xs:attribute name="estado" type="xs:string"/>
<xs:attribute name="fechaUltimaModificacion" type="xs:dateTime"/>
<xs:attribute name="nombre" type="xs:string"/>
<xs:attribute name="valor" type="xs:string"/>
</xs:complexType>
</xs:schema>
这很好用,但是当我运行 jaxb 插件时,属性“fechaUltimaModificacion”是 XMLGregorianCalendar,而不是 LocalDateTime,因为我缺少全局绑定。
那么,有没有办法以编程方式将这几行 xml 添加到 xsd 中?也许有一个我不知道的注释或属性。
提前致谢。
编辑:我在生成到 xsd 输出中的两个 java 类上方添加,看到我有适配器注释但是 xsd 输出没有改变。