XmlJavaTypeAdapter XmlElement 不适用于多个字段

XmlJavaTypeAdapter XmlElement not working for multiple fields

我有一个像下面这样的xml,我需要用这个xml来填充下面的对象 我需要日期采用所需的格式和日期的时间戳转换。我使用下面提到的代码做到了这一点。

<customer>
    <name>john</name>
    <date>10/10/18</date>
<customer>

@XmlRootElement(name="customer")
@XmlAccessorType(XmlAccessType.FIELD)
public class Customer {

    @XmlElement(name="name")
    private String name;

    @XmlJavaTypeAdapter (DateSort.class)
    @XmlElement(name="date")
    private String date;

    @XmlJavaTypeAdapter (TimeStampSort.class)
    @XmlElement(name="date")
    private long dateTimestamp;

    setters()/getters()
}

public class DateSort extends XmlAdapter<String, String> implements DateFormats {

    @Override
    public String marshal(String date) throws Exception {
        return dateFormat.format(date);
    }

    @Override
    public String unmarshal(String date) throws ParseException {
        Date pubDate = sourceDateFormat.parse(date);
        return outputDateFormat.format(pubDate);
    }
}

public class TimeStampSort extends XmlAdapter<String, Long> implements DateFormats {

    @Override
    public Long unmarshal(String date) throws Exception {
        Date newDate = sourceDateFormat.parse(date);
        return Long.parseLong(monthFormat.format(newDate));
    }

    @Override
    public String marshal(Long date) throws Exception {
        return new Date(date).toString ();
    }
}

我在这里面临的问题是 XmlJavaTypeAdapter 被调用用于 "date" 但不是用于 dateTimestamp 属性。我不确定为什么会存在这种行为。

我试过做这个配置

@XmlJavaTypeAdapter (value=DateSort.class, type=Long.class)
@XmlElement(name="PUBDATE", type=Long.class)


@XmlJavaTypeAdapter (value=DateSort.class, type=long.class)
@XmlElement(name="PUBDATE", type=long.class)

并将类型转换为

private Long timeStamp; 

None 有效。

这里的问题是我需要通过转换将同一个元素映射到多个 pojo 字段。 是否需要添加任何额外的注释才能实现此目的?

请帮我解决这个问题,为什么在 DateSort 被调用并且工作正常的地方没有调用 TimeStampSort 适配器。

以下示例说明了如何实现您的要求。

最好还是这样做 "further up",即在服务中检索未编组的值时。一般来说,你尽量避免在简单的映射对象中有太多的逻辑。

@XmlRootElement
class Customer {

    private String name;

    private String date;

    private long dateTimestamp;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getDate() {
        return date;
    }

    public void setDate(String date) {
        this.date = date; // You can do additional transformations here
        try {
            this.dateTimestamp = new SimpleDateFormat("MM/dd/yy").parse(date).getTime();
        } catch (ParseException e) {
            // Handle this appropriately ;-)
        }
    }

    public long getDateTimestamp() {
        return dateTimestamp;
    }

    @Override
    public String toString() {
        return new StringJoiner(", ", Customer.class.getSimpleName() + "[", "]")
                .add("name='" + name + "'")
                .add("date='" + date + "'")
                .add("dateTimestamp=" + dateTimestamp)
                .toString();
    }

}

public class XmlUnmarshaller {

    private static final String XML_STRING =
            "<customer>\n" +
            "    <name>john</name>\n" +
            "    <date>10/10/18</date>\n" +
            "</customer>";

    public static void main(String[] args) {

     try {
        JAXBContext jaxbContext = JAXBContext.newInstance(Customer.class);

        Unmarshaller jaxbUnmarshaller = jaxbContext.createUnmarshaller();
        Customer customer = (Customer) jaxbUnmarshaller.unmarshal(new ByteArrayInputStream(XML_STRING.getBytes(StandardCharsets.UTF_8)));
        System.out.println(customer);

      } catch (JAXBException e) {
        e.printStackTrace();
      }
    }

}