Форматирование даты с помощью OpenFeign

#spring-boot #jackson #objectmapper #openfeign

#весенняя загрузка #джексон #objectmapper #openfeign

Вопрос:

Мой клиент 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 Jan 31 00:00:00 EST 2001
 

То, что я пытаюсь получить, это :

 ---> 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;
        }
       }
 

Есть идеи?

Ответ №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);
 

Комментарии:

1. это дата, а не локальная дата, и моя проблема связана с притворством

2. нет, это не так. вы просто предоставляете неверно сформированную дату из другого места и пытаетесь настроить feign, чтобы проанализировать ее так, как вы хотите. попробуйте применить приведенные выше строки в методе тестирования без каких-либо ненужных настроек