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

如何在Spring Data Elasticsearch中反序列化OffsetDateTime?

哈宪
2023-03-14

当我只是从集群中获取文档时,我无法在spring data elasticsearch中反序列化OffsetDateTime。有一些方法可以解决这个问题,但大多数都适用于以前版本的Spring boot。在spring data elasticsearch的当前快照版本中,jackson映射器也被删除,并替换为一些映射器类。

有人可以给我一个提示,如何正确解决这个问题与当前版本的启动弹性6。x/7。x?

com.fasterxml.jackson.databind.exc.InvalidDefinitionException: Cannot construct instance of `java.time.OffsetDateTime` (no Creators, like default construct, exist): cannot deserialize from Object value (no delegate- or property-based Creator)

我正在使用REST高级客户端。

解决方案:使用自定义实体映射器解决:

public class CustomEntityMapper implements EntityMapper {

    private final ObjectMapper objectMapper;

    public CustomEntityMapper() {

            JavaTimeModule javaTimeModule = new JavaTimeModule();
            javaTimeModule.addDeserializer(LocalDateTime.class, new MillisOrLocalDateTimeDeserializer());

            objectMapper = new ObjectMapper()
                                      .disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES)
                                      .enable(DeserializationFeature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
                                     .enable(DeserializationFeature.READ_DATE_TIMESTAMPS_AS_NANOSECONDS)
                                      .disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS)
                                      .registerModule(javaTimeModule)
            ;

            objectMapper.setVisibility(objectMapper.getSerializationConfig().getDefaultVisibilityChecker()
                            .withFieldVisibility(JsonAutoDetect.Visibility.ANY)
                            .withGetterVisibility(JsonAutoDetect.Visibility.NONE)
                            .withSetterVisibility(JsonAutoDetect.Visibility.NONE)
                            .withCreatorVisibility(JsonAutoDetect.Visibility.NONE));

            objectMapper.findAndRegisterModules();
    }

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

    @Override
    public Map<String, Object> mapObject(Object source) {
        return null;
    }

    @Override
    public <T> T readObject(Map<String, Object> source, Class<T> targetType) {
        return null;
    }
}

共有1个答案

后易安
2023-03-14

对于Spring Data Elasticsearch 3.2,您需要使用定制的Jackson映射器来注册相应的模块。

从Spring Data Elasticsearch 4.0开始(目前作为里程碑版本4.0.0可用。M3)OffsetDateTime可以使用自定义日期格式写入和读取,似乎OffsetDateTime对解析很挑剔,我本以为basic_date_time格式应该可以工作,但我必须找到一个自定义格式字符串。

我只是尝试了以下定义:

@Field(type=FieldType.Date, format=DateFormat.custom, pattern="uuuu-MM-dd'T'HH:mm:ss.SSSSSSSSSZ")

但如前所述,这将适用于即将发布的Spring Data Elasticsearch第4版。

 类似资料:
  • 问题内容: 我的直觉告诉我,必须以某种方式将其转换为字符串或byte [](在Go中甚至可能是相同的东西?),然后将其保存到磁盘。 我找到了这个包(http://golang.org/pkg/encoding/gob/),但似乎仅用于结构? 问题答案: 序列化数据有多种方法,Go为此提供了许多软件包。某些常见编码方式的软件包: 处理地图很好。以下示例显示了地图的编码/解码: 操场

  • 我有一个kdtree,其节点由以下字段组成:公共静态类节点实现可序列化{ 其中DataPoint定义: 公共静态类DataPoint实现可序列化{公共可比X;公共可比Y;公共可比Z; 我想序列化树,存储在文件中并在回答范围查询时反序列化。我对这个概念od序列化的理解并不好。从我收集的任何内容中,我编写了以下函数,但不起作用。有人能帮忙吗?

  • 我需要序列化/反序列化特定枚举: 我有个例外: 我如何通过GSON序列化/反序列化它?

  • 我加载xml文件如下 使2类 我加载xml文件(temp.xml),然后序列化类2位置和头然后StringReader,它从文件中读取字符串,然后类序列化成为反序列化 但我看到error error msg在XML文档中有一个错误(1,1)。哪里?:at系统。Xml。序列化。XmlSerializer。在系统上反序列化(XmlReader XmlReader、String encodingStyl

  • 但这只有在保证先设置start的情况下才起作用。

  • 问题内容: 我已经开始在我的第一个android应用程序上进行工作,并且具有处理多层图像的应用程序。我能够将项目文件的平面版本导出为PNG,但我希望能够保存分层图像以供以后编辑(包括应用于某些层的任何选项,例如基于文本的层)。 无论如何,我已经确保需要写入文件的类是“可序列化的”,但是由于android.graphics.Bitmap不可序列化这一事实而遇到了一些障碍。以下代码实质上将位图作为PN