XmlJavaTypeAdapter的XmlElement不工作的多个字段

问题描述 投票:1回答:1

我有一个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领域。是否有需要被添加到实现这一目标的任何额外的注解?

请帮我解决这个问题,如为什么TimeStampSort适配器不会被调用,其中作为DateSort被调用,并正常工作。

java xml java-8 marshalling unmarshalling
1个回答
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();
      }
    }

}
© www.soinside.com 2019 - 2024. All rights reserved.