【问题标题】:Format Date with OpenFeign使用 OpenFeign 格式化日期
【发布时间】:2021-03-15 00:17:37
【问题描述】:

我的 Feign 客户端定义如下:

@FeignClient(name = "${feign.name}",url = "${feign.url}",
        configuration = {DateFormatConfiguration.class})
public interface MyFeignClient {

@GetMapping(value = "/test")
    ResponseEntity<MyResponse> getResponse(@RequestParam(value = "date") Date date);

}

地点:

 class DateFormatConfiguration {
    
    DateFormat df = new SimpleDateFormat("yyyy-MM-dd");

    @Bean
    public FeignFormatterRegistrar dateFeignFormatterRegistrar() {
        return formatterRegistry -> formatterRegistry.addFormatter(new Formatter<Date>() {
            @Override
            public Date parse(String text, Locale locale) throws ParseException {
                return df.parse(text);
            }
            @Override
            public String print(Date object, Locale locale) {
                return df.format(object);
            }
        });
    }
   }

但是当我运行这个测试时:

@Test
public void test(){
    Date date= new GregorianCalendar(2000, 12, 31).getTime();
    myFeignClient.getResponse(date);
}

请求以这种格式发送:

---> GET https:xxx/test?date=Wed%20Jan%2031%2000%3A00%3A00%20EST%202001

我想要的是:

---> GET https:xxx/test?date=2000-12-31

日期是我需要的格式化程序。

我也尝试过这个解决方案,但都没有工作:

class DateFormatConfiguration {
        
        DateFormat df = new SimpleDateFormat("yyyy-MM-dd");
    
        @Bean
        public JacksonEncoder feignEncoder() {
            return new JacksonEncoder(customObjectMapper());
        }
    
        @Bean
        public JacksonDecoder feignDecoder() {
            return new JacksonDecoder(customObjectMapper());
        }
    
        private ObjectMapper customObjectMapper(){
            ObjectMapper objectMapper = new ObjectMapper();
            objectMapper.setDateFormat(df);
            return objectMapper;
        }
       }

有什么想法吗?

【问题讨论】:

    标签: spring-boot jackson objectmapper openfeign


    【解决方案1】:

    您应该考虑尝试用以下内容替换必要的行:

    DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy-MM-dd");    
    LocalDate date= LocalDate.ofInstant(new GregorianCalendar(2000, 12, 31).getTime().toInstant(), ZoneId.of(TimeZone.getDefault().getID()));
    String dateFormatted = date.format(dtf);
    

    【讨论】:

    • 这是一个日期而不是本地日期,我的问题是 Feign
    • 不,不是。您只是从其他地方提供格式错误的日期,并试图假装以您想要的方式解析它。请尝试在测试方法中应用上面的行,而不需要任何不必要的配置
    猜你喜欢
    • 2013-04-06
    • 2012-05-05
    • 2015-09-29
    • 2018-05-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多