【问题标题】:Java 14 records json serializationJava 14 记录 json 序列化
【发布时间】:2020-03-17 11:20:08
【问题描述】:

目前正在尝试使用 java 14 的 Records 实现,一切看起来都不错,但是由于访问器略有不同,并且 jackson 无法反序列化并给出以下错误:

Caused by: com.fasterxml.jackson.databind.exc.InvalidDefinitionException: No serializer found for class com.x.x.x.xTracking and no properties discovered to create BeanSerializer (to avoid exception, disable SerializationFeature.FAIL_ON_EMPTY_BEANS)

我检查了整个互联网,包括 jackson 和 gson github 以检查 jep 359 支持,但没有找到一条评论。我真的错过了什么吗?

是的,我知道 java 14 仍未发布,并且该版本的记录仅处于预览状态,但至少预计会有一些 cmets。

【问题讨论】:

  • 编辑:通过在 java 记录定义中添加 @JsonProperty 它确实序列化了带注释的属性。然而,如何配置公共方法的反序列化策略而不仅仅是传统的“getter”,因为记录上的属性不是以 get...
  • 记录是一种预览功能。由于它们的任何内容都不是最终的,包括 API,因此没有库会开始支持它们,因为它可能不再适用于下一次记录迭代。

标签: java json jackson gson spring-webflux


【解决方案1】:

Jackson 2.12.0 (https://github.com/FasterXML/jackson-future-ideas/issues/46) 添加了记录支持。它将在接下来的几天内发布。

【讨论】:

    【解决方案2】:

    对于其他人的实验,我不骄傲地四处走动,如下:

        @Bean
        public Jackson2ObjectMapperBuilderCustomizer jacksonCustomizer(){
            return builder ->
                    builder.visibility(PropertyAccessor.FIELD, JsonAutoDetect.Visibility.ANY);
        }
    

    【讨论】:

      【解决方案3】:

      我让 Jackson 在 Spring Boot 2.4.1 应用程序中处理了这个问题,并用

      @JsonAutoDetect(fieldVisibility = JsonAutoDetect.Visibility.ANY)
      

      【讨论】:

        【解决方案4】:

        或者,对于 Spring Boot 2.4.5 和 Java 16,它可以通过 application.properties 启用,如下所示:

        spring.jackson.visibility.field=any

        Spring Boot documentation 上查看更多信息。

        【讨论】:

          【解决方案5】:

          使用“纯”Json-B,您可以这样做:

          public class RecordPropertyVisibilityStrategy implements PropertyVisibilityStrategy {
             @Override
             public boolean isVisible(Field field) {return true;}
          
             @Override
             public boolean isVisible(Method method) {return false;}
          }
          

          然后

          @JsonbVisibility(RecordPropertyVisibilityStrategy.class)
          public record MyRecord(Long id, String attr) {}
          

          【讨论】:

            猜你喜欢
            • 2022-11-23
            • 2020-07-30
            • 2020-08-02
            • 1970-01-01
            • 1970-01-01
            • 2014-10-14
            • 2022-01-18
            • 1970-01-01
            • 2014-08-19
            相关资源
            最近更新 更多