Formatter <LocalDateTime>не регистрируется в контейнере Spring Boot в приложении REST - PullRequest
0 голосов
/ 07 апреля 2020

Я реализовал средство форматирования в приложении веб-службы REST Spring Boot для форматирования всех атрибутов LocalDateTime (Java 8), чтобы они отображались в указанном формате c в ответе веб-службы.

public class LocalDateTimeFormatter implements Formatter<LocalDateTime> {

    @Override
    public String print(LocalDateTime temporal, Locale locale) {
        DateTimeFormatter formatter = DateTimeFormatter
                .ofPattern("yyyy-MM-dd HH:mm:ss");
        return formatter.format(temporal);
    }

    @Override
    public LocalDateTime parse(String text, Locale locale)
            throws ParseException {
        return LocalDateTime.parse(text);
    }

}

Форматер также был зарегистрирован, как показано ниже, чтобы он работал на уровне приложения, чтобы избежать индивидуального аннотирования всех атрибутов LocalDateTime

@Configuration
public class ContentFormatter implements WebMvcConfigurer {

    @Override
    public void addFormatters(FormatterRegistry registry) {
            registry.addFormatter(new LocalDateTimeFormatter());
    }
}

Но форматирование не применяется к ответу из Интернета сервис, accessDate является типом атрибута LocalDateTime

{
  "content" : "Hello, World!",
  "id" : 0,
  "accessDate" : "2020-04-07T19:56:41.48"
 }

Ответы [ 2 ]

0 голосов
/ 07 апреля 2020

Вы можете использовать StdSerializer

public class JacksonLocalDateSerializer extends StdSerializer<LocalDate> {

  private static final long serialVersionUID = -7880057299936771237L;

  private static final DateTimeFormatter formatter =
      DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")
      .withResolverStyle(ResolverStyle.STRICT);

  public JacksonLocalDateSerializer() {
    this(null);
  }

  public JacksonLocalDateSerializer(Class<LocalDate> type) {
    super(type);
  }

  @Override
  public void serialize(LocalDate value, JsonGenerator jsonGenerator,
      SerializerProvider serializerProvider) throws IOException, JsonProcessingException {
    jsonGenerator.writeString(formatter.format(value));
  }
}

Затем добавить конфигурацию для сериализатора для всего приложения


@Configuration
public class JacksonConfig {

  @Bean
  @Primary
  public ObjectMapper configureObjectMapper() {

    JavaTimeModule javaTimeModule = new JavaTimeModule();

    javaTimeModule.addSerializer(LocalDateTime.class, new JacksonLocalDateTimeSerializer());
    ObjectMapper mapper = new ObjectMapper();
    mapper.registerModule(javaTimeModule);
    return mapper;
  }

}
0 голосов
/ 07 апреля 2020

Возможно, вам даже не нужно реализовывать форматированный файл и регистрировать его. Просто аннотируйте ваше свойство LocalDateTime следующим образом:

@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss")
public LocalDateTime getTime() {
    return time;
}

Кроме того, вам может потребоваться добавить следующую зависимость:

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

Подробнее см. Этот вопрос и его ответ: Spring Данные JPA - формат ZonedDateTime для json сериализации

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