Java Spring XML反序列化LocalDate等日期类型返回null值如何解决
问题原因及修复方案
1. 核心错误:XmlAdapter反序列化逻辑为空
你自定义的OffsetDateTimeAdapter、LocalDateAdapter的unmarshal方法直接返回null,这是日期字段反序列化后为空的最直接原因,需要补全解析逻辑:
// OffsetDateTimeAdapter 示例 public class OffsetDateTimeAdapter extends XmlAdapter<String, OffsetDateTime> { @Override public OffsetDateTime unmarshal(String inputDate) throws Exception { // 适配你请求中的日期格式,如有特殊格式可自定义DateTimeFormatter return OffsetDateTime.parse(inputDate); } @Override public String marshal(OffsetDateTime inputDate) throws Exception { return inputDate.toString(); } } // LocalDateAdapter 示例 public class LocalDateAdapter extends XmlAdapter<String, LocalDate> { @Override public LocalDate unmarshal(String inputDate) throws Exception { return LocalDate.parse(inputDate); } @Override public String marshal(LocalDate inputDate) throws Exception { return inputDate.toString(); } }
2. 补充Jackson依赖,支持JAXB注解和Java8时间类型
Spring Boot默认使用Jackson处理XML请求反序列化,默认不会识别@XmlJavaTypeAdapter这类JAXB注解,同时需要额外依赖支持Java8的时间类型解析,在pom.xml中补充以下依赖:
<!-- 支持JAXB注解 --> <dependency> <groupId>com.fasterxml.jackson.module</groupId> <artifactId>jackson-module-jaxb-annotations</artifactId> <version>2.13.0</version> </dependency> <!-- 支持Java8时间类型 --> <dependency> <groupId>com.fasterxml.jackson.datatype</groupId> <artifactId>jackson-datatype-jsr310</artifactId> <version>2.13.0</version> </dependency>
3. 修复Gson序列化逻辑
你当前使用Gson做Java对象转JSON,Gson默认也不支持Java8时间类型的序列化,需要补充配置:
public String convertDateToJson(DateWrapper dateWrapper) { GsonBuilder gsonBuilder = new GsonBuilder(); // 注册Java8时间类型序列化适配器,也可以用第三方gson-javatime-serialisers库简化配置 gsonBuilder.registerTypeAdapter(LocalDate.class, (TypeAdapter<LocalDate>) new TypeAdapter<LocalDate>() { @Override public void write(JsonWriter out, LocalDate value) throws IOException { out.value(value.toString()); } @Override public LocalDate read(JsonReader in) throws IOException { return LocalDate.parse(in.nextString()); } }); gsonBuilder.registerTypeAdapter(OffsetDateTime.class, (TypeAdapter<OffsetDateTime>) new TypeAdapter<OffsetDateTime>() { @Override public void write(JsonWriter out, OffsetDateTime value) throws IOException { out.value(value.toString()); } @Override public OffsetDateTime read(JsonReader in) throws IOException { return OffsetDateTime.parse(in.nextString()); } }); gsonBuilder.setPrettyPrinting(); gsonBuilder.disableHtmlEscaping(); Gson gson = gsonBuilder.create(); return gson.toJson(dateWrapper, DateWrapper.class); }
如果没有特殊要求,建议直接用Jackson做JSON序列化,避免同时维护Jackson和Gson两套序列化配置。
4. 可选:配置消息转换器适配JAXB
如果你希望直接用JAXB而非Jackson处理XML反序列化,可以在Spring配置类中注册Jaxb2RootElementHttpMessageConverter:
@Configuration public class WebConfig implements WebMvcConfigurer { @Override public void configureMessageConverters(List<HttpMessageConverter<?>> converters) { converters.add(new Jaxb2RootElementHttpMessageConverter()); } }
内容的提问来源于stack exchange,提问作者szelelaci
相关产品推荐
相关产品推荐

