Java反序列化LocalDateTime对象

4

这是我的适配器类:

public class LocalDateTimeAdapter extends XmlAdapter<String, LocalDateTime> {

    @Override
    public LocalDateTime unmarshal(String v) throws Exception {
        return new LocalDateTime(v);
    }

    @Override
    public String marshal(LocalDateTime v) throws Exception {
        return v.toString();
    }

}

这是一个对象类,我希望在其中存储日期:

    @XmlAccessorType(XmlAccessType.FIELD)
    public class Object {

    @XmlJavaTypeAdapter(LocalDateTimeAdapter.class)
    private LocalDateTime time;

    public LocalDateTime getTime() {
            return time;
    }

由于某些原因,我无法编译它。它显示问题出现在 return new LocalDateTime(v);。这是我收到的错误信息:

Error:(9, 16) java: constructor LocalDateTime in class java.time.LocalDateTime cannot be applied to given types;
      required: java.time.LocalDate,java.time.LocalTime
      found: java.lang.String
      reason: actual and formal argument lists differ in length

同时还有 XML 部分:

<time type="dateTime">2000-01-01T19:45:00Z</time>

我正在按照这个示例进行操作。


这个问题很古老,但我还是要问一下,为了后人着想:您确定要使用LocalDateTime吗?我问的原因是XML片段包括一个时区(“Z”代表Zulu,基本上是GMT的昵称),而LocalDateTime没有包括时区信息。我在想:使用ZoneDateTime是否更合适? - Greg Hadaller
1个回答

5

可能你正在使用Java 8中的LocalDateTime。这个类没有任何字符串构造函数。

在你所遵循的示例中,LocalDateTime来自于JodaTime

因此,你可以有两种方法:

  • Import org.joda.time.LocalDateTime (you will need JodaTime dependency) instead of java.time.LocalDateTime;

  • or change unmarshal method to something like this:

    @Override
    public LocalDateTime unmarshal(String v) throws Exception {
        return LocalDateTime.parse(v);
    }
    
你可能需要通知日期时间格式,因为默认格式是2011-12-03T10:15:30,也许应该改成这样:
@Override
public LocalDateTime unmarshal(String v) throws Exception {
    return LocalDateTime.parse(v, DateTimeFormatter.ISO_INSTANT);
}

此外,在java.time.LocalDateTime中,toString将输出以下ISO-8601格式之一:
  • uuuu-MM-dd'T'HH:mm
  • uuuu-MM-dd'T'HH:mm:ss
  • uuuu-MM-dd'T'HH:mm:ss.SSS
  • uuuu-MM-dd'T'HH:mm:ss.SSSSSS
  • uuuu-MM-dd'T'HH:mm:ss.SSSSSSSSS

我在想,如果我使用 return LocalDateTime.parse(v.substring(0,v.length-1));,它也能正常工作..那么有什么区别呢? - vixero
你可以确保在marshalunmarshal中使用相同的模式,这是可以的。 - Bruno Ribeiro
顺便提一下,它可以使用 DateTimeFormatter.ISO_DATE_TIME 但不能使用 DateTimeFormatter.ISO_INSTANT。为什么呢? - vixero
可能是因为输入格式的问题。在DateTimeFormatter中,您可以查看这些常量的格式。 - Bruno Ribeiro

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接