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
相关产品推荐
相关产品推荐

