下面我就来详细讲解一下“Spring Cloud Feign服务之间调用,date类型转换错误的问题”的完整攻略。
背景
在使用 Spring Cloud Feign 服务之间调用时,有些服务可能会返回 Date 类型的数据。在接收返回数据时,如果没有配置比较完善的解决方案,就会出现 Date 类型的解析错误。
问题描述
Spring Cloud Feign 在调用服务时,会自动将返回的 Json 数据转换成对应的 Java 对象。但是对于 Date 类型的数据,在转换过程中,很容易发生类型转换错误。例如,服务返回的时间格式为“2022-05-23T10:30:00.000+08:00”,但是 Feign 在转换时却将其转换成了“2728356666667”。
解决方案
方案一:使用 Jackson 的日期格式化
在处理 Date 类型数据时,可以在 Feign Client 中增加 Jackson 的日期格式化功能,这样就可以正确地将 Json 数据转换成对应的 Java 对象。
具体步骤如下:
- 给 Feign Client 增加配置类
@Configuration
public class FeignConfig {
@Bean
public Decoder decoder() {
ObjectMapper objectMapper = new ObjectMapper();
objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
objectMapper.setTimeZone(TimeZone.getTimeZone("Asia/Shanghai"));
return new ResponseEntityDecoder(new SpringDecoder(new JacksonDecoder(objectMapper)));
}
}
- 在 Feign Client 中引用配置类
@FeignClient(name = "example-service", configuration = FeignConfig.class)
这样设置之后,Feign 就会使用 Jackson 来执行数据的反序列化,从而得到正确的 Date 类型数据。
方案二:使用 LocalDate 数据类型
除了使用 Jackson 的日期格式化,还可以将 Date 类型替换为 LocalDate 数据类型,这样也能解决 Date 类型转换错误的问题。
具体步骤如下:
- 将 Date 类型替换为 LocalDate 类型
在服务提供方和服务消费方中,将 Date 类型替换为 LocalDate 类型,例如:
public class ExampleDTO {
private LocalDate date;
// 其他属性和方法...
}
- 修改 Controller 和 Feign Client
在服务提供方和服务消费方的 Controller 中和 Feign Client 接口中,将 Date 类型替换为 LocalDate 类型,例如:
@GetMapping("/example")
public ExampleDTO example() {
ExampleDTO exampleDTO = new ExampleDTO();
exampleDTO.setDate(LocalDate.now());
return exampleDTO;
}
@FeignClient(name = "example-service")
public interface ExampleFeignClient {
@GetMapping("/example")
ExampleDTO example();
}
经过上述操作,就能够正确地接收和处理 LocalDate 类型的数据了。
示例说明
下面通过两个示例来说明 Spring Cloud Feign 服务之间调用时,Date 类型转换错误的问题及解决方案。
示例一:使用 Jackson 的日期格式化
服务提供方代码如下:
@RestController
public class ExampleController {
@GetMapping("/example")
public ExampleDTO example() {
ExampleDTO exampleDTO = new ExampleDTO();
exampleDTO.setDate(new Date());
return exampleDTO;
}
}
服务消费方的配置文件中,需要增加以下配置:
spring.jackson.serialization.WRITE_DATES_AS_TIMESTAMPS=false
Feign Client 中的代码如下:
@FeignClient(name = "example-service", configuration = FeignConfig.class)
public interface ExampleFeignClient {
@GetMapping("/example")
ExampleDTO example();
}
@Configuration
public class FeignConfig {
@Bean
public Decoder decoder() {
ObjectMapper objectMapper = new ObjectMapper();
objectMapper.setTimeZone(TimeZone.getTimeZone("Asia/Shanghai"));
objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
return new ResponseEntityDecoder(new SpringDecoder(new JacksonDecoder(objectMapper)));
}
}
public class ExampleDTO {
private Date date;
// 其他属性和方法...
}
示例二:使用 LocalDate 数据类型
服务提供方代码如下:
@RestController
public class ExampleController {
@GetMapping("/example")
public ExampleDTO example() {
ExampleDTO exampleDTO = new ExampleDTO();
exampleDTO.setDate(LocalDate.now());
return exampleDTO;
}
}
服务消费方的代码如下:
@FeignClient(name = "example-service")
public interface ExampleFeignClient {
@GetMapping("/example")
ExampleDTO example();
}
public class ExampleDTO {
private LocalDate date;
// 其他属性和方法...
}
经过以上操作,就能够完美地解决 Spring Cloud Feign 服务之间调用时,Date 类型转换错误的问题了。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:springcloud feign服务之间调用,date类型转换错误的问题 - Python技术站