2016-09-27 6 views
0

У меня есть следующий класс, который включает в себя список даты, которые я хочу mashall. Я создал JaxBAdapter для класса Date, но, похоже, он не вызывается.XMLAdapter для списка дат

Я думаю, что проблема заключается в том, что я использую список, а не только переменную Date.

Не могли бы вы дать мне подсказку о том, как я должен кодировать адаптер или аннотировать класс так, чтобы каждый элемент списка mashalled с помощью адаптера?

Будет ли она работать для JSON сериализации, а? Я планирую использовать эти классы в своем веб-сервисе REST.

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); 
    } 
} 

ответ

0

В @XmlJavaTypeAdapter работы как таковой с java.util.List, а также. Но проблема в классе адаптера - это формат даты, который используется. JAXB (atleast 2.x и далее) не является строгим и не сообщает о таких ошибках и спокойно подавляет его.

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

изменение

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

 Смежные вопросы

  • Нет связанных вопросов^_^