Spring Boot для сериализации Instant через MessageConverters - PullRequest
0 голосов
/ 10 октября 2018

Я пытаюсь выяснить, как настроить ObjectMapper внутри стандартных MessageConverters RestTemplate для сериализации Instants в виде строки формата ISO 8601 вместо числа.Я хотел бы избежать аннотирования каждого Момента в моих моделях.

@SpringBootApplication
@RestController
public class DemoApplication {
    public static void main(String[] args) {
        SpringApplication.run(DemoApplication.class, args);
    }

    @PostMapping("/test")
    public String get(@RequestBody String object) {
        return object;
    }

    public String send(TestObject object) {
        return new RestTemplateBuilder().rootUri("http://localhost:8080").defaultMessageConverters().build()
            .exchange("/test", HttpMethod.POST, new HttpEntity<>(object, headers()), String.class).getBody();
    }

    private HttpHeaders headers() {
        final HttpHeaders httpHeaders = new HttpHeaders();
        httpHeaders.setContentType(MediaType.APPLICATION_JSON);
        return httpHeaders;
    }

    @AllArgsConstructor
    @Getter
    @Setter
    public static class TestObject {
        private Instant test;
    }
}

Я бы хотел, чтобы этот тест прошел, учитывая приведенный выше код

@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.DEFINED_PORT)
@RunWith(SpringRunner.class)
public class InstantTest {

    @Autowired
    private DemoApplication client;

    @Test
    public void name() {
        final String time = "2018-10-09T12:00:00.000Z";
        final String response = client.send(new DemoApplication.TestObject(Instant.parse(time)));
        assertThat(response).contains(time);
    }
}

В этом примере используются Jackson 2.9.6 и Spring Boot 2.0.5.Я попытался

  • Отключить WRITE_DATE_TIMESTAMPS_AS_NANOSECONDS на автоматически настроенном ObjectMapper
  • С помощью spring.jackson.serialization.write_date_timestamps_as_nanoseconds = false
  • Предоставление пользовательского Jackson2ObjectMapperBuilder

Я явно что-то упускаю, так как это похоже на поведение по умолчанию или, по крайней мере, легко настраиваемое.

1 Ответ

0 голосов
/ 10 октября 2018

Вы можете создать свой собственный RestTemplate с помощью Custom RestTemplateBuilder и достичь этого.

Например,

@Configuration
public class Config{
    @Bean
    public RestTemplate  restTemplate() {
        RestTemplateBuilder builder = new RestTemplateBuilder();
        //You can initialize your custom message converter here;
        HttpMessageConverter<?> messageConverters = new  MappingJackson2HttpMessageConverter();
        builder.messageConverters(messageConverters);
        return builder.build();
    }
}

Вы можете иметь свой собственный MessageConvertor для сериализации экземпляров как ISO 8601.

Для дальнейшего чтения перейдите по этой ссылке .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...