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();
}
}
}
我有一个像下面这样的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();
}
}
}