Во время преобразования java -объект (dto) в Json происходит преобразование даты прерывания при настройке addCorsMappings () - PullRequest
0 голосов
/ 16 апреля 2020

Нам нужно настроить глобальную конфигурацию, которая описывает настройку cors-header для запросов.

Я использую SpringBoot, и проект загружается весной в файл расширения * .war.

@SpringBootConfiguration
@EnableScheduling
@SpringBootApplication
public class App
        extends SpringBootServletInitializer
        implements WebApplicationInitializer {

    private static final Logger LOGGER  = LoggerFactory.getLogger( App.class );

    public static void main(String[] args) {

        LOGGER.info("Start an application...");

        SpringApplication.run(App.class, args);
    }


    @Override
    protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {

        LOGGER.info("There is building the web application!");

        return builder.sources(App.class);
    }
}

Это урегулирование для заголовка cors. Я должен импортировать конфигурацию Spring MVC ( @ EnableWeb Mvc), чтобы настроенная мной конфигурация работала.

@EnableWebMvc
@Configuration
public class CorsGlobalConfiguration {

 private final static String ROOT_API = "/**";

    @Bean
    public WebMvcConfigurer corsConfig(){

        return new WebMvcConfigurer() {
            @Override
            public void addCorsMappings(CorsRegistry registry) {
                registry.addMapping(ROOT_API)
                        .allowedHeaders("*")
                        .allowedOrigins("*")
                .allowedMethods("GET","POST","PUT");
            }
        };
    }
}

Но клиент получил json в дате, которая входит в массив.

Например:

Клиент должен получить:

"2020-03-14T11: 32: 33",

Но клиент получает

[2020, 03, 14, 11, 32, 33]

Update_1

Я сделал.

@Configuration
public class JacksonConfig {

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

Не работает.

enter image description here

Update_2

Я сделал.

spring.jackson.serialization.WRITE_DATES_AS_TIMESTAMPS = false

Не работает.

Update_3

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

и

spring.jackson.serialization.WRITE_DATES_AS_TIMESTAMPS = false

Это также не работает.

enter image description here

Update_4

I выполнил следующие действия:

  • application.properties
#spring.jackson.serialization.WRITE_DATES_AS_TIMESTAMPS=false
@Component
public class JacksonLocalDateSerializer extends StdSerializer<LocalDateTime> {

    private static final long serialVersionUID = -7880057299936771237L;

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

    public JacksonLocalDateSerializer(Class<LocalDateTime> t) {
        super(t);
    }

    public JacksonLocalDateSerializer() {
        this(null);
    }

    @Override
    public void serialize(LocalDateTime value, JsonGenerator gen, SerializerProvider provider) throws IOException {
        gen.writeString(formatter.format(value));
    }
}
@Configuration
public class JacksonConfig {


    private JacksonLocalDateSerializer jacksonLocalDateSerializer;

    @Autowired
    public JacksonConfig(JacksonLocalDateSerializer jacksonLocalDateSerializer) {
        this.jacksonLocalDateSerializer = jacksonLocalDateSerializer;
    }

    @Bean
    @Primary
    public ObjectMapper configureObjectMapper() {

        JavaTimeModule javaTimeModule = new JavaTimeModule();
        javaTimeModule.addSerializer(LocalDateTime.class, this.jacksonLocalDateSerializer);

        ObjectMapper objectMapper = new ObjectMapper();
        objectMapper.registerModule(javaTimeModule);
        objectMapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);

        return objectMapper;
    }
}

  • dto
...
  private LocalDateTime statusDate;
...

Я получаю:

enter image description here

Почему это так?

Хо w сделать это правильно?

У кого есть идеи?

Ответы [ 2 ]

1 голос
/ 16 апреля 2020

Добавьте jackson-datatype-jsr310 к вашим зависимостям.

<dependency>
    <groupId>com.fasterxml.jackson.datatype</groupId>
    <artifactId></artifactId>
    <version>2.9.7</version>
</dependency>

Затем добавьте свойство ниже к вашему application.properties файлу:

spring.jackson.serialization.WRITE_DATES_AS_TIMESTAMPS = false

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

Если вы добавите @EnableWebMvc, то по умолчанию SerializationFeature.WRITE_DATES_AS_TIMESTAMPS будет включено. Итак, настройте Jackson Object Mapper вручную, чтобы отключить это.

@Configuration
public class JacksonConfig {

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

или

измените его на application.properties

spring.jackson.serialization.WRITE_DATES_AS_TIMESTAMPS = false

Вы также можете добавить свой собственный класс сериализатора, используя эту строку (например, JacksonLocalDateSerializer)

javaTimeModule.addSerializer(LocalDate.class, new JacksonLocalDateSerializer());

Пример: Здесь мне нужно показать как формат yyyy-MM-dd HH:mm:ss

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

...