XML中替代@JsonDeserialize实现日期转毫秒的注解方案
在XML响应中实现日期转毫秒数的自定义转换
好问题!在XML序列化/反序列化场景下,我们通常用**JAXB(Java Architecture for XML Binding)**来实现类似Jackson的自定义转换逻辑,和你用@JsonDeserialize的思路本质一致,只是注解与实现方式略有不同,具体步骤如下:
1. 创建自定义XML适配器(类似JSON的Deserializer)
你需要编写一个继承自XmlAdapter的适配器类,它负责处理XML中的日期与毫秒数之间的转换逻辑:
import javax.xml.bind.annotation.adapters.XmlAdapter; import java.text.SimpleDateFormat; import java.util.Date; public class DateToMillisecsXmlAdapter extends XmlAdapter<String, Long> { // 替换为你实际使用的日期格式,比如"yyyy-MM-dd'T'HH:mm:ss" private static final SimpleDateFormat DATE_FORMAT = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); @Override public Long unmarshal(String dateStr) throws Exception { // 将XML中的日期字符串解析为Date,再转换为毫秒数 Date date = DATE_FORMAT.parse(dateStr); return date.getTime(); } @Override public String marshal(Long millisecs) throws Exception { // (可选)如果需要将毫秒数序列化为XML日期字符串,实现此方法 if (millisecs == null) { return null; } Date date = new Date(millisecs); return DATE_FORMAT.format(date); } }
2. 在实体类字段上绑定适配器
和Jackson的@JsonDeserialize类似,用@XmlJavaTypeAdapter注解将适配器绑定到目标字段上:
import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlRootElement; import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter; @XmlRootElement @XmlAccessorType(XmlAccessType.FIELD) public class YourEntity { // 绑定自定义适配器,实现XML日期到毫秒数的转换 @XmlJavaTypeAdapter(DateToMillisecsXmlAdapter.class) private Long millisecs; // 其他字段、Getter/Setter方法... }
额外说明
- 如果XML中的日期是标准XML Schema的
dateTime类型(而非字符串),可以将适配器的泛型改为XmlGregorianCalendar,调整unmarshal方法的解析逻辑即可。 - 适配器同时支持反序列化(XML→毫秒数)和序列化(毫秒数→XML),如果只需要反序列化,
marshal方法可以返回null,但建议完整实现以避免潜在的序列化问题。 - 确保项目中已引入JAXB依赖:Spring Boot项目默认包含相关依赖;普通Java项目需引入
jakarta.xml.bind:jakarta.xml.bind-api及实现包(如org.glassfish.jaxb:jaxb-runtime)。
内容的提问来源于stack exchange,提问作者secret_cinema
相关产品推荐
相关产品推荐

