Spring: форматирование даты в ответе REST без изменения класса домена - PullRequest
0 голосов
/ 21 февраля 2019

У меня есть проект Spring 5 (не Spring Boot), конечная точка которого возвращает объект, определенный в банке зависимостей (я не могу его изменить).Этот объект имеет поле, которое является датой (LocalDateTime).

Дата отформатирована в ответе так:

{
    "dayOfMonth": 21,
    "dayOfWeek": "THURSDAY",
    "month": "FEBRUARY",
    "year": 2019,
    "dayOfYear": 52,
    "hour": 11,
    "minute": 24,
    "nano": 753000000,
    "second": 32,
    "monthValue": 2,
    "chronology": {
        "id": "ISO",
        "calendarType": "iso8601"
    }
}

Как я могу написать как ISO 8601 или подобное?Я попытался добавить следующие зависимости:

<dependency>
    <groupId>com.fasterxml.jackson.datatype</groupId>
    <artifactId>jackson-datatype-jsr310</artifactId>
    <version>2.9.8</version>
</dependency>
<dependency>
    <groupId>com.fasterxml.jackson.datatype</groupId>
    <artifactId>jackson-datatype-jdk8</artifactId>
    <version>2.9.8</version>
</dependency>

Я также попытался создать основной компонент для ObjectMapper:

@Bean
@Primary
public ObjectMapper objectMapper() {
    ObjectMapper objectMapper = new ObjectMapper();
    objectMapper.registerModule(new JavaTimeModule());
    objectMapper.registerModule(new Jdk8Module());
    objectMapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);
    return objectMapper;
}

Картограф работает нормально, когда используется явно, но не тогда, когда Spring возвращаетОтвет JSON REST.

Чтобы упростить и не писать весь код, я бы хотел, чтобы конечные точки, такие как приведенная ниже, неявно форматировали дату правильно.

    @GetMapping(path = "/date", produces = "application/json")
    public @ResponseBody ResponseEntity<LocalDateTime> date(@RequestHeader HttpHeaders headers) {
        return new ResponseEntity<>(LocalDateTime.now(), HttpStatus.OK);
    }

Спасибо.

1 Ответ

0 голосов
/ 21 февраля 2019

Я исправил это, добавив класс Configuration, который связывает мой ObjectMapper с HTTPMessageConverter на основе этой записи в блоге .

@Configuration
public class JacksonConfiguration {

    @Autowired
    ObjectMapper mapper;

    private RequestMappingHandlerAdapter annotationMethodHandlerAdapter;

    @PostConstruct
    public void init() {
        List<HttpMessageConverter<?>> messageConverters = annotationMethodHandlerAdapter.getMessageConverters();
        for (HttpMessageConverter<?> messageConverter : messageConverters) {
            if (messageConverter instanceof MappingJackson2HttpMessageConverter) {
                MappingJackson2HttpMessageConverter m = (MappingJackson2HttpMessageConverter) messageConverter;
                m.setObjectMapper(mapper);
            }
        }
    }

    @Autowired
    public void setAnnotationMethodHandlerAdapter(RequestMappingHandlerAdapter annotationMethodHandlerAdapter) {
        this.annotationMethodHandlerAdapter  = annotationMethodHandlerAdapter;
    }
}
...