使用 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);
}
}
这是解组 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);
}
}
我正在尝试将 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);
}
}
这是解组 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);
}
}