XmlAdapter用于列出日期

时间:2016-09-27 15:05:27

标签: java jaxb adapter

我有以下类,其中包含我想要设置的日期列表。我已经为Date类创建了JaxBAdapter,但它似乎没有被调用。

我认为问题在于我使用的是列表而不仅仅是日期变量。

你能否给我一些提示,我应该如何编写适配器代码或注释类,以便使用适配器对列表中的每个元素进行编组?

它也适用于JSON序列化吗?我计划在我的REST Web服务上使用这些类。

Root.java

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

  @XmlElementWrapper(name="timePeriods")
  @XmlElement(name = "timePeriod")
  @JsonProperty(value = "timePeriod")
  @XmlJavaTypeAdapter(value = JaxBDateThreadSafeAdapter.class, type = Date.class)
  private List<Date> timePeriod;

  public Root() {
    this(new ArrayList<String>(), new ArrayList<Date>(2));
  }

  public Root(List<Date> timePeriod) {
    this.timePeriod = new ArrayList<Date>(timePeriod);
  }  
}

JaxBAdapter

public class JaxBDateThreadSafeAdapter extends XmlAdapter<String, Date> {

  /**
   * Thread safe {@link DateFormat}.
   */
  private static final ThreadLocal<DateFormat> DATE_FORMAT_TL =
          new ThreadLocal<DateFormat>() {

            @Override
            protected DateFormat initialValue() {
              // return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
                  // ISO 8601 format
              return new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZ");
            }

          };

  @Override
  public String marshal(Date v) throws Exception {
    return DATE_FORMAT_TL.get().format(v);
  }

  @Override
  public Date unmarshal(String v) throws Exception {
    return DATE_FORMAT_TL.get().parse(v);
  }
}

1 个答案:

答案 0 :(得分:0)

@XmlJavaTypeAdapter同样适用于java.util.List。但适配器类中的问题是使用的日期格式。 JAXB(至少2.x起)并不严格,不要报告此类错误并悄悄地压制它。

return new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZ");

更改为

return new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'");