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

Spring Boot 2.1.9中RestTemplate解析XML时间格式报错的解决方法

解决Jackson XML反序列化日期字符串时的MismatchedInputException问题

嘿,这个问题我之前在项目里也碰到过,其实就是Jackson XML在解析<dtAlteracao>里的日期字符串时,找不到正确的方式把它转换成你POJO里的日期类型,所以才抛出这个“找不到String参数构造方法”的错误。我给你几个靠谱的解决办法:

1. 给POJO的日期字段添加正确注解并确保构造方法齐全

首先检查你的POJO类,对应的dtAlteracao字段如果是LocalDateTime或者Date类型,一定要加上@JsonFormat注解指定匹配的日期格式,同时必须有无参构造器(Jackson默认需要这个来创建实例),全参构造器也建议加上。

示例POJO代码:

import com.fasterxml.jackson.annotation.JsonFormat;
import java.time.LocalDateTime;

public class YourTargetPojo {
    // 匹配XML里的日期格式
    @JsonFormat(pattern = "yyyy-MM-dd'T'HH:mm:ss.SSS")
    private LocalDateTime dtAlteracao;

    // 无参构造器必须要有!
    public YourTargetPojo() {}

    // 全参构造器(可选,但建议加上)
    public YourTargetPojo(LocalDateTime dtAlteracao) {
        this.dtAlteracao = dtAlteracao;
    }

    // getter和setter方法
    public LocalDateTime getDtAlteracao() {
        return dtAlteracao;
    }

    public void setDtAlteracao(LocalDateTime dtAlteracao) {
        this.dtAlteracao = dtAlteracao;
    }
}

2. 自定义RestTemplate的JacksonXmlMapper配置

如果仅仅加注解还不行,可能是RestTemplate默认的XML消息转换器没有配置支持Java 8日期类型(比如LocalDateTime)。这时候需要手动配置XmlMapper,注册JavaTimeModule模块。

示例配置代码:

import com.fasterxml.jackson.dataformat.xml.XmlMapper;
import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.converter.xml.MappingJackson2XmlHttpMessageConverter;
import org.springframework.web.client.RestTemplate;

@Configuration
public class RestTemplateConfig {

    @Bean
    public RestTemplate restTemplate() {
        RestTemplate restTemplate = new RestTemplate();

        // 创建自定义的XML消息转换器
        MappingJackson2XmlHttpMessageConverter xmlConverter = new MappingJackson2XmlHttpMessageConverter();
        XmlMapper xmlMapper = new XmlMapper();

        // 注册JavaTimeModule,支持LocalDateTime等Java 8日期类型
        xmlMapper.registerModule(new JavaTimeModule());
        // 关闭日期转时间戳的特性,强制用字符串格式解析
        xmlMapper.disable(com.fasterxml.jackson.databind.SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);

        xmlConverter.setObjectMapper(xmlMapper);

        // 替换RestTemplate里默认的XML转换器
        restTemplate.getMessageConverters().replaceAll(converter ->
                converter instanceof MappingJackson2XmlHttpMessageConverter ? xmlConverter : converter);

        return restTemplate;
    }
}

3. 确保Jackson相关依赖版本一致

你用的是Spring Boot 2.1.9.RELEASE,它默认依赖的Jackson版本是2.9.10,但你手动指定了2.10.0的版本。一定要确保所有Jackson相关的依赖版本统一,避免版本冲突导致的奇怪问题。

Maven依赖示例(确保所有Jackson依赖都是2.10.0):

<dependencies>
    <!-- 其他依赖... -->
    <dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-core</artifactId>
        <version>2.10.0</version>
    </dependency>
    <dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-databind</artifactId>
        <version>2.10.0</version>
    </dependency>
    <dependency>
        <groupId>com.fasterxml.jackson.dataformat</groupId>
        <artifactId>jackson-dataformat-xml</artifactId>
        <version>2.10.0</version>
    </dependency>
    <!-- 支持Java 8日期类型的模块 -->
    <dependency>
        <groupId>com.fasterxml.jackson.datatype</groupId>
        <artifactId>jackson-datatype-jsr310</artifactId>
        <version>2.10.0</version>
    </dependency>
</dependencies>

总结

核心问题就是Jackson不知道如何把XML里的日期字符串转换成你POJO中的日期类型,通过字段注解指定格式+配置全局XmlMapper支持日期类型+统一依赖版本这三个步骤,基本就能解决这个异常了。

内容的提问来源于stack exchange,提问作者cviniciusm

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 08:12:37