XmlJavaTypeAdapter XmlElement不适用于多个字段

时间:2019-02-07 09:51:28

标签: java xml java-8 marshalling unmarshalling

我有一个像下面这样的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被称为“日期”,而不是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; 

这些都不起作用。

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

请帮助我解决为什么在调用DateSort并不能正常工作的地方调用TimeStampSort Adapter的问题。

1 个答案:

答案 0 :(得分:0)

以下是如何实现要求的示例。

最好“进一步”进行此操作,即在检索未编组的值时在服务中进行。一般来说,您要避免在简单的映射对象中使用过多的逻辑。

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

}