当前位置: 首页 > 知识库问答 >
问题:

在Spring Boot和ElasticSearch中使用Instant,LocalDateTime和ZonedDateTime

贲宜春
2023-03-14
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern ="yyyy-MM-dd'T'HH:mm:ss.SSSZZ")
"creationDate": "2019-04-10T14:49:05.672+0000"
"creationDate": {
    "dayOfYear": 123,
    "dayOfWeek": "FRIDAY",
    "month": "MAY",
    "dayOfMonth": 3,
    "year": 2019,
    "monthValue": 5,
    "hour": 11,
    "minute": 54,
    "second": 12,
    "nano": 238000000,
    "chronology": {
        "id": "ISO",
        "calendarType": "iso8601"
    }
},
public class CustomEntityMapper implements EntityMapper {
    private final ObjectMapper objectMapper;

    public CustomEntityMapper(ObjectMapper objectMapper) {  
        this.objectMapper = new ObjectMapper();
        objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
        objectMapper.configure(DeserializationFeature.ACCEPT_SINGLE_VALUE_AS_ARRAY, true);
        objectMapper.registerModule(new CustomGeoModule());
        objectMapper.registerModule(new JavaTimeModule());
    }

    @Override
    public String mapToString(Object object) throws IOException {
        return objectMapper.writeValueAsString(object);
    }

    @Override
    public <T> T mapToObject(String source, Class<T> clazz) throws IOException {
        return objectMapper.readValue(source, clazz);
    }
}

将以下内容添加到对象映射器:

objectMapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false);

任何帮助或指点我的错误将是感激的。

共有1个答案

花阳秋
2023-03-14

设法使它与Spring Boot2.1.4和Spring Data Jest一起工作。以下是我所做的:

>

  • 示例域对象:

    @Document(indexName = "datetest")
    public class DateTest {
    
        @Id
        private String id;
    
        @Field(type = FieldType.Date, format = DateFormat.custom, pattern = "yyyy-MM-dd'T'HH:mm:ss.SSSZZ")
        @JsonFormat(shape = JsonFormat.Shape.STRING, pattern ="yyyy-MM-dd'T'HH:mm:ss.SSSZZ", timezone = "UTC")
        private Instant instant = Instant.now();
    
        @Field(type = FieldType.Date, format = DateFormat.custom, pattern = "yyyy-MM-dd'T'HH:mm:ss.SSSZZ")
        @JsonFormat(shape = JsonFormat.Shape.STRING, pattern ="yyyy-MM-dd'T'HH:mm:ss.SSSZZ")
        private ZonedDateTime zonedDateTime = ZonedDateTime.now();
    
        @Field(type = FieldType.Date, format = DateFormat.custom, pattern = "yyyy-MM-dd'T'HH:mm:ss.SSS")
        @JsonFormat(shape = JsonFormat.Shape.STRING, pattern ="yyyy-MM-dd'T'HH:mm:ss.SSS")
        private LocalDateTime localDateTime = LocalDateTime.now();
    
        // getters/setters
    }
    

    ElasticSearch/JEST配置

    @Configuration
    public class ESConfig {
    
        @Bean
        public EntityMapper getEntityMapper() {
            return new CustomEntityMapper();
        }
    
        @Bean
        @Primary
        public ElasticsearchOperations elasticsearchTemplate(final JestClient jestClient,
                final ElasticsearchConverter elasticsearchConverter,
                final SimpleElasticsearchMappingContext simpleElasticsearchMappingContext, EntityMapper mapper) {
            return new JestElasticsearchTemplate(jestClient, elasticsearchConverter,
                    new DefaultJestResultsMapper(simpleElasticsearchMappingContext, mapper));
        }
    
        public class CustomEntityMapper implements EntityMapper {
    
            private final ObjectMapper objectMapper;
    
            public CustomEntityMapper() {
                objectMapper = new ObjectMapper();
                objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
                objectMapper.configure(DeserializationFeature.ACCEPT_SINGLE_VALUE_AS_ARRAY, true);
                objectMapper.registerModule(new CustomGeoModule());
                objectMapper.registerModule(new JavaTimeModule());
            }
    
            @Override
            public String mapToString(Object object) throws IOException {
                return objectMapper.writeValueAsString(object);
            }
    
            @Override
            public <T> T mapToObject(String source, Class<T> clazz) throws IOException {
                return objectMapper.readValue(source, clazz);
            }
    
        }
    }
    

    ElasticSearch中的结果:

  •  类似资料:
    • 问题内容: 我知道: 即时是用于计算的“技术”时间戳表示(纳秒)。 LocalDateTime是日期/时钟表示形式,包括人类的时区。 最后,对于大多数应用程序用例,IMO都可以视为两种类型。例如:当前我正在运行一个批处理作业,我需要根据日期计算下一次运行,并且我正在努力寻找这两种类型之间的优缺点(除了Instant和时区部分的纳秒级精度优势)的LocalDateTime)。 您可以列举一些应用示例

    • 我知道: 即时是一种用于计算的“技术性”时间戳表示(纳秒)。 LocalDateTime是包含人类时区的日期/时钟表示形式。 最终,IMO两者都可以作为大多数应用程序用例的类型。例如:当前,我正在运行一个批处理作业,需要根据日期计算下一次运行,我正在努力寻找这两种类型之间的优劣(除了Instant的纳秒精度优势和LocalDateTime的时区部分)。

    • 我在我的模型中使用LocalDateTime,在包括LocalDateTimeDeserializer之后,将bean字段转换为 包括 属性在SpringBoot的应用程序中。属性文件,应用程序最终能够反序列化JSON并正确显示如下内容:, 但是,当我进行测试时,它会忽略WRITE_DATES_AS_TIMESTAMPS标志,我猜它会为上面相同的字符串日期生成一个输出, 请注意,在测试资源文件夹中

    • 我想把@AutoWired注释变成一个“方面”。我想在我的方面中注入一个存储库,但是当我试图调用autowired类的方法时,出现了NullPointException。 我已经尝试在aspect类上添加,但我出现了同样的错误。 如果我不使用aspect类,而是使用,我可以毫无问题地调用存储库。 一些文档谈到了spring的xml文件配置,但在spring boot,我没有这些文件。 这里是pom

    • 问题内容: 我正在使用Java 8中的新java.time包。我有一个遗留数据库,可以将其转换为。 我想做的是添加一个基于另一个数据库标志的时间段。我可能要加上几天,几周,几个月或几年。我不想关心我要添加的内容,并且希望将来能够添加更多选项。 我的第一个想法是,但这给了我大于一天的价值。即时显然不支持大时间单位上的操作。好吧,随便吧。 因此,我得到了以下代码: 现在,这是我第一次使用新的time

    • 在以下情况下,哪些可用的java 8时间API类最适合JPA实体映射: 按信息类型创建的合同 日期以UTC格式存储在数据库中 业务逻辑以UTC进行所有计算 日期显示在欧洲/维也纳时区的UI中 我看到的大多数示例都使用LocalDateTime,但其中一个没有任何时区的概念。既然我们的所有业务逻辑都应该在UTC中进行计算,并在UTC中检索/存储数据,那么Instant或ZonedDateTime不是