LocalDateTime不显示为时间戳(即长时间)java 8 Spring Boot 2.2.0

62o28rlo  于 2022-11-29  发布在  Spring
关注(0)|答案(2)|浏览(131)

在访问了所有关于它的页面后,我发现并尝试了许多想法,没有一个对我有用,所以我写了这篇文章。我在java 8 spring boot 2.2.0中的API有从xsd文件生成的bean。我最近将日期类型改为LocalDateTime(因为弃用所以是时候改了).问题是,以前,日期以时间戳格式显示(作为long),现在LocalDateTime以数组显示,我不需要它。
我试图解决的问题是:

  • 我在配置类上有一个WebMvc注解,删除了它,没有解决这个问题。
  • 我添加了WRITE_DATES_AS_TIMESTAMPS:false在我的应用程序.yml中(在此属性上尝试了多种格式)
  • 我有一个消息转换器的配置类,我试图在其中手动强制使用时间戳。
  • 我想在我的bean中添加一个Json注解,但是由于它是从xsd生成的,我不知道这是否可行。

下面是消息转换器的配置类的代码片段:

@Configuration
   public class MVCConfigure implements WebMvcConfigurer {
    @Autowired
    private ObjectMapper jacksonObjectMapper;

    @Override
    public void extendMessageConverters(List<HttpMessageConverter<?>> converters) {

        converters.removeIf(c -> c instanceof MappingJackson2HttpMessageConverter);

        jacksonObjectMapper.enable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);
        converters.add(httpMessageConverterV1V2);

这些解决方案都不起作用,我仍然得到一个LocalDateTime数组(我想要一个long)。
下面是我获取LocalDateTime的方法:

private LocalDateTime getFirstLocalDateTime(final SolrDocument doc, final String key) {
        LocalDateTime ldt = null;
        Date solrDate = (Date) doc.getFirstValue(key);
        if(solrDate != null){
            ldt = solrDate.toInstant().atZone(ZoneId.systemDefault()).toLocalDateTime();
        }
        return ldt;
    }

ps:我使用Date从SolrDoc获取Date的原因是因为我不能直接强制转换为LocalDateTime
实际值:“最后索引日期”:[ 2022年第1期第4期第2期第2期第2期第655000000 ]
期望值:“最后索引日期”:1641261722655
那么,有可能得到我想要的东西吗?

yzuktlbb

yzuktlbb1#

感谢@deHaar,他给了我一些提示,我找到了继续前进的方法。
我创建了一个自定义序列化程序:

public class LocalDateTimeSerialize extends StdSerializer<LocalDateTime> {

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

    @Override
    public void serialize(LocalDateTime localDateTime, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException {
        Long l = localDateTime.toInstant(OffsetDateTime.now().getOffset())
                .toEpochMilli();
        jsonGenerator.writeString(l.toString());
    }
}

我将extendMessageConverters更改为在objectMapper中使用此自定义序列化程序:

ObjectMapper objectMapper = new ObjectMapper();
objectMapper.registerModule(new JavaTimeModule()
                .addSerializer(LocalDateTime.class, new LocalDateTimeSerialize(LocalDateTime.class)));
xjreopfe

xjreopfe2#

我宁愿设置此配置,这样您就不必创建自定义序列化程序:

spring:
    jackson:
        serialization:
          write-dates-as-timestamps: true

或在Map器中设置它:

@Bean
    public MappingJackson2HttpMessageConverter jsonConverter() {
        ObjectMapper mapper = new ObjectMapper();
        mapper.registerModule(new JavaTimeModule());
        mapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, true);
        mapper.configure(SerializationFeature.INDENT_OUTPUT, true);
        mapper.configure(SerializationFeature.FAIL_ON_EMPTY_BEANS, true);
        mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, true);
        return new MappingJackson2HttpMessageConverter(mapper);
    }

相关问题