【spring boot/spring cloud踩坑记录】使用feign进行get请求时,对参数中的JSR310日期类进行处理

使用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>()

猜你喜欢

转载自blog.csdn.net/woluoyifan/article/details/80108353