使用 JAXB 解组日期但出现空指针异常

Unmarshalling dates using JAXB but getting nullpointer exception

我正在尝试将 XML 转换为 java 对象。在我的 xml 中,有一个字段看起来像:

<pickDisplayTs>2021-09-24T18:03:06.603 +0000</pickDisplayTs>

我的 Java 对象如下所示:

@XmlElement(name = "pickDisplayTs" )
@XmlJavaTypeAdapter(DateAdapter.class)
public Date pickDisplayTs;

我的 DataAdapter class 如下:

    import javax.xml.bind.annotation.adapters.XmlAdapter;
    import java.text.SimpleDateFormat;
    import java.util.Date;

   public class DateAdapter extends XmlAdapter<String, Date> {

   private static final String CUSTOM_FORMAT_STRING = "yyyy-MM- 
   dd'T'HH:mm:ss.SSS'Z'";


    @Override
    public Date unmarshal(String v) throws Exception {
    return new SimpleDateFormat(CUSTOM_FORMAT_STRING).parse(v);
   }

@Override
public String marshal(Date v) throws Exception {
    return new SimpleDateFormat(CUSTOM_FORMAT_STRING).format(v);
}

}

代码参考:https://github.com/eugenp/tutorials/blob/950bbadc353bdca114befc98cf4a18476352220e/jaxb/src/main/java/com/baeldung/jaxb/dateunmarshalling/DateAdapter.java

这是解组 xml 文件的方法:

  String filepath = "xml/PickComplete.xml";
  String xmlPickComplete = readFromResources(filepath);
  PickComp pickCompleteMq = Xml.xmlToObject(xmlPickComplete, PickingSubSystemOrderCompleteMessage.class);

整个 pickCompleteMq 将变为空,但如果我将 pickDisplayTs 声明为字符串,一切都很好,但不确定我哪里出错了。但我需要该字段在日期中。

如有任何帮助,我们将不胜感激。谢谢。

输入有问题。 XML 您提供的摘录不符合您使用的 DateAdapter。如果您封送包含 Date 的 pojo,预期的 xml 标签应该是

<pickDisplayTs>2022-02-16T14:02:13.010Z</pickDisplayTs>

尝试解析给定的输入会出现 ParseException。 代码片段:

Date parse = new SimpleDateFormat(CUSTOM_FORMAT_STRING).parse("2021-09-24T18:03:06.603 +0000");
System.out.println(parse);

输出

java.text.ParseException: Unparseable date: "2021-09-24T18:03:06.603 +0000"
at java.text.DateFormat.parse(DateFormat.java:366)

解决方案建议:

    private static final String CUSTOM_FORMAT_STRING = "yyyy-MM-dd'T'HH:mm:ss.SSS Z";
    public static void main(String[] args) throws ParseException {
        String dateStr = "2021-09-24T18:03:06.603 +0000";
        Date marshaledDate = new SimpleDateFormat(CUSTOM_FORMAT_STRING).parse(dateStr);

        SimpleDateFormat format = new SimpleDateFormat(CUSTOM_FORMAT_STRING);
        format.setTimeZone(TimeZone.getTimeZone("UTC"));

        String unmarshalledDate = format.format(marshaledDate);
        System.out.println(unmarshalledDate);
    }

您可以在您的 DataAdapter class 中使用上述逻辑,如下所示:

public class DateAdapter extends XmlAdapter<String, Date> {
        private static final String CUSTOM_FORMAT_STRING = "yyyy-MM-dd'T'HH:mm:ss.SSS Z";

        @Override
        public Date unmarshal(String v) throws Exception {
            return new SimpleDateFormat(CUSTOM_FORMAT_STRING).parse(v);
        }

        @Override
        public String marshal(Date v) throws Exception {
            SimpleDateFormat sdf = new SimpleDateFormat(CUSTOM_FORMAT_STRING);
            sdf.setTimeZone(TimeZone.getTimeZone("UTC"));
            return sdf.format(v);
        }
    }