LocalDateTime 不显示为时间戳(即很长)java 8 spring boot 2.2.0
LocalDateTime not displaying as timestamps (ie as a long) java 8 spring boot 2.2.0
在访问了所有关于它的页面后,我发现并尝试了许多想法,none 对我有用,所以我写了这个 post。
java 8 spring boot 2.2.0 中的 API 具有从 xsd 文件生成的 bean。我最近将 Date 类型更改为 LocalDateTime(因为弃用所以是时候更改了)。
问题是,以前 Date 以时间戳格式显示(很长),现在 LocalDateTime 显示在数组中,我不想要它。
我试图解决的问题:
- 我在配置上有一个 WebMvc 注释 class,删除了它,但没有解决问题。
- 我在我的 application.yml 中添加了 WRITE_DATES_AS_TIMESTAMPS: true(在此属性上尝试了多种格式)
- 我有一个消息转换器的配置 class,我试图在其中手动强制执行时间戳ps。
- 我想在我的 bean 中添加一个 Json 注释,但由于它是从 xsd 生成的,我不知道这是否可能。它是?
这是消息转换器的配置 class 片段:
@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 的数组(我想要一个长数组)。
这是我获取 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 获取日期的原因是因为我不能直接转换为 LocalDateTime
实际价值:
“lastIndexedDate”:[
2022年,
1、
4、
2、
2、
2、
655000000
]
期望值:
“lastIndexedDate”:1641261722655
那么,有可能得到我想要的吗?
感谢@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)));
在访问了所有关于它的页面后,我发现并尝试了许多想法,none 对我有用,所以我写了这个 post。 java 8 spring boot 2.2.0 中的 API 具有从 xsd 文件生成的 bean。我最近将 Date 类型更改为 LocalDateTime(因为弃用所以是时候更改了)。 问题是,以前 Date 以时间戳格式显示(很长),现在 LocalDateTime 显示在数组中,我不想要它。
我试图解决的问题:
- 我在配置上有一个 WebMvc 注释 class,删除了它,但没有解决问题。
- 我在我的 application.yml 中添加了 WRITE_DATES_AS_TIMESTAMPS: true(在此属性上尝试了多种格式)
- 我有一个消息转换器的配置 class,我试图在其中手动强制执行时间戳ps。
- 我想在我的 bean 中添加一个 Json 注释,但由于它是从 xsd 生成的,我不知道这是否可能。它是?
这是消息转换器的配置 class 片段:
@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 的数组(我想要一个长数组)。
这是我获取 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 获取日期的原因是因为我不能直接转换为 LocalDateTime
实际价值: “lastIndexedDate”:[ 2022年, 1、 4、 2、 2、 2、 655000000 ]
期望值: “lastIndexedDate”:1641261722655
那么,有可能得到我想要的吗?
感谢@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)));