You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 09:27:04