0

我正在尝试使用 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 输出没有改变。

4

0 回答 0