使用feign时,一般会编写一个接口类作为方法来进行调用。如
String say(@RequestParam("time")LocalDateTime time);
在处理jsr310规定的LocalDate、LocalDateTime时,feign默认的序列化方式是相当于进行.toString()。
以LocalDateTime为例子,参数实际序列化后的样式是类似以下样式的
2018-01-01T00:00:00.000
这是ISO标准规定的样式,但是却往往不是我们系统中需要的样式,通常我们需要的样式是
2018-01-01 00:00:00
这时候,就需要注册一个额外的转化器来进行转化
@Configuration
public class FeignFormatterRegister implements FeignFormatterRegistrar {
@Override
public void registerFormatters(FormatterRegistry registry) {
registry.addFormatter(new LocalDateTimeFormatter());
}
public class LocalDateTimeFormatter implements Formatter<LocalDateTime> {
@Override
public LocalDateTime parse(String text, Locale locale) {
return LocalDateTime.parse(text);
}
@Override
public String print(LocalDateTime date, Locale locale) {
return date.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
}
}
}
通过注册这个Formatter,就可以实现自定义的样式输出。
在provider端,则使用以下代码进行处理。
@RequestMapping("/say")
@ResponseBody
public LocalDateTime say(@RequestParam @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") LocalDateTime time){
return time;
}
注意!@RequestParam注解是必须的!
这点和String\Integer等"基本"类型不一样,spring对于"基本"类型是视为默认带有 @RequestParam(required=false,name=参数名) 注解来进行处理的。
而对于jsr310支持的日期时间类型,需要加入@RequestParam才能正确处理,否则会抛出以下异常
java.lang.NoSuchMethodException: java.time.LocalDateTime.<init>()