Quarkus - 带 OffsetDateTime 的 JAXB?

问题描述 投票:0回答:1

我正在尝试使用 Quarkus 3.15 和 JAXB 将 XML

String
反序列化为 Java
Object
。 我的 Java 对象有一个类型为
OffsetDateTime
的属性,但是当我尝试反序列化它时,出现以下错误:

No default constructor found on class java.time.OffsetDateTime: java.lang.NoSuchMethodException: java.time.OffsetDateTime.<init>()
    at java.base/java.lang.Class.getConstructor0(Class.java:3585)
    at java.base/java.lang.Class.getDeclaredConstructor(Class.java:2754)
    at org.glassfish.jaxb.core.v2.ClassFactory.tryGetDeclaredConstructor(ClassFactory.java:109)
    at org.glassfish.jaxb.core.v2.ClassFactory.create0(ClassFactory.java:78)
    at org.glassfish.jaxb.runtime.v2.runtime.ClassBeanInfoImpl.createInstance(ClassBeanInfoImpl.java:255)
    at org.glassfish.jaxb.runtime.v2.runtime.unmarshaller.UnmarshallingContext.createInstance(UnmarshallingContext.java:655)
    at org.glassfish.jaxb.runtime.v2.runtime.unmarshaller.StructureLoader.startElement(StructureLoader.java:156)
    at org.glassfish.jaxb.runtime.v2.runtime.unmarshaller.UnmarshallingContext._startElement(UnmarshallingContext.java:530)
    at org.glassfish.jaxb.runtime.v2.runtime.unmarshaller.UnmarshallingContext.startElement(UnmarshallingContext.java:509)
    at org.glassfish.jaxb.runtime.v2.runtime.unmarshaller.SAXConnector.startElement(SAXConnector.java:137)
    at java.xml/com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.startElement(AbstractSAXParser.java:518)
    at java.xml/com.sun.org.apache.xerces.internal.parsers.AbstractXMLDocumentParser.emptyElement(AbstractXMLDocumentParser.java:183)
    at java.xml/com.sun.org.apache.xerces.internal.impl.XMLNSDocumentScannerImpl.scanStartElement(XMLNSDocumentScannerImpl.java:351)
    at java.xml/com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl$FragmentContentDriver.next(XMLDocumentFragmentScannerImpl.java:2726)
    at java.xml/com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl.next(XMLDocumentScannerImpl.java:605)
    at java.xml/com.sun.org.apache.xerces.internal.impl.XMLNSDocumentScannerImpl.next(XMLNSDocumentScannerImpl.java:112)
    at java.xml/com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanDocument(XMLDocumentFragmentScannerImpl.java:542)
    at java.xml/com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:889)
    at java.xml/com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:825)
    at java.xml/com.sun.org.apache.xerces.internal.parsers.XMLParser.parse(XMLParser.java:141)
    at java.xml/com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.parse(AbstractSAXParser.java:1224)
    at java.xml/com.sun.org.apache.xerces.internal.jaxp.SAXParserImpl$JAXPSAXParser.parse(SAXParserImpl.java:637)
    at org.glassfish.jaxb.runtime.v2.runtime.unmarshaller.UnmarshallerImpl.unmarshal0(UnmarshallerImpl.java:218)
    at org.glassfish.jaxb.runtime.v2.runtime.unmarshaller.UnmarshallerImpl.unmarshal(UnmarshallerImpl.java:189)
    at jakarta.xml.bind.helpers.AbstractUnmarshallerImpl.unmarshal(AbstractUnmarshallerImpl.java:152)
    at jakarta.xml.bind.helpers.AbstractUnmarshallerImpl.unmarshal(AbstractUnmarshallerImpl.java:205)

我的 Java 对象看起来像这样:

@XmlRootElement(name="MyXmlPojo")
@XmlAccessorType(XmlAccessType.FIELD)
public class MyXmlPojo {

    @XmlElement
    private String propA = null;

    @XmlElement
    private String propB = null;

    @XmlElement
    private OffsetDateTime dateProp = null;

    <snip>
}

有没有办法在JAXB中轻松支持

OffsetDateTime

编辑:添加了一个带有注释的示例 Pojo,与我正在使用的类似

java jaxb quarkus offsetdatetime
1个回答
0
投票

您应该将以下注释添加到您的

OffsetDateTime
字段中:

@XmlJavaTypeAdapter(OffsetDateTimeAdapter.class)

其中

OffsetDateTimeAdapter
是一个
extends XmlAdapter<String, OffsetDateTime>
的类,其基本代码如下:

public class OffsetDateTimeAdapter extends XmlAdapter<String, OffsetDateTime> {

    @Override
    public OffsetDateTime unmarshal(String inputDate) {
        if (inputDate == null) {
            return null;
        }
        // method logic to get OffsetDateTime from String with appropriate format
        return OffsetDateTime.parse(inputDate);
    }

    @Override
    public String marshal(OffsetDateTime inputDate) {
        if (inputDate == null) {
            return null;
        }
        // method logic to get String from OffsetDateTime with appropriate output format
        return inputDate.toString();
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.