有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

用于日期列表的java XmlAdapter

我有下面的类,其中包括一个日期列表,我想将其混合在一起。我已经为Date类创建了JaxBAdapter,但它似乎没有被调用

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

您能给我一些提示,说明我应该如何对适配器进行编码或注释类,以便使用适配器对列表中的每个元素进行mashall吗

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

根。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) 个答案

  1. # 1 楼答案

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

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

    换成

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