【问题标题】:How to ignore "handler": {}, "hibernateLazyInitializer": {} in json jackson in Spring hibernate project?如何在 Spring hibernate 项目的 json jackson 中忽略“handler”:{}、“hibernateLazyInitializer”:{}?
【发布时间】:2017-05-25 18:40:01
【问题描述】:

我正在使用 fastxml json 和对象映射器,下面是我的代码:

 ObjectMapper mapper = new ObjectMapper();
        mapper.configure(SerializationFeature.FAIL_ON_EMPTY_BEANS, false);
        mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);

        try {
            String jsonInString = mapper.writeValueAsString(myClassObjectHere);
            return new ResponseEntity<String>(jsonInString, HttpStatus.OK);
        } catch (JsonProcessingException e) {
            e.printStackTrace();
            return new ResponseEntity<String>(HttpStatus.INTERNAL_SERVER_ERROR);
        }

我已经实现和使用代码的方式,我得到了想要的输出,但是 json 在某些 json 对象中有 2 个随机的奇怪值,如下所示:

"listing": {
          "listingId": 1,
          "name": "Business",
          "handler": {},
          "hibernateLazyInitializer": {}
        },
        "handler": {},
        "hibernateLazyInitializer": {}
      },

如何配置 objectmappper 以忽略输出 json 中的 "handler": {}, "hibernateLazyInitializer": {} 值?

我尝试了以下解决方案:

objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);

但它不起作用,输出仍然与我在上面发布的相同。 另外,我知道我可以通过使用 @JsonIgnoreProperties({"hibernateLazyInitializer", "handler"}) 注释类来忽略 json 中的这些处理程序和 hibernateLazyInitializer,但是是否有任何方法可以全局配置 json jackson 对象映射器,这样它就不会在我输出的 json 中添加这些值?

【问题讨论】:

  • 尝试使用 DeserializationConfig.Feature.FAIL_ON_UNKNOWN_PROPERTIES 而不是 objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
  • 你用的是哪个版本的jackson?
  • 我使用的是2.8.5版本
  • 我在使用DeserializationConfig.Feature.FAIL_ON_UNKNOWN_PROPERTIES 时收到此错误无法解析或不是字段
  • 这是杰克逊 1.9 以下版本,因为您使用的是 2.8.5,所以我的建议不起作用

标签: java json spring hibernate jackson


【解决方案1】:

@JsonIgnoreProperties(value = {"hibernateLazyInitializer", "handler"}) 类上添加注释对我有用。

【讨论】:

  • 为防止丢失之前定义的属性,请使用:@JsonIgnoreProperties(ignoreUnknown = true, value = {"hibernateLazyInitializer", "handler"}) ,因为ignoreUnknown的默认值为false,删除它可能会导致不同的错误
【解决方案2】:

您可以尝试在 Object.class 中添加一个 mixin:

public ObjectMapper getObjectMapper() {
    ObjectMapper mapper = new ObjectMapper();
    mapper.addMixIn(Object.class, IgnoreHibernatePropertiesInJackson.class);
    return mapper;
}

@JsonIgnoreProperties({"hibernateLazyInitializer", "handler"})
private abstract class IgnoreHibernatePropertiesInJackson{ }

【讨论】:

  • 如果我们不使用实体类并且它是一个普通的 POJO 怎么办?
  • 它有效!我不知道如何或为什么,但它有效。
【解决方案3】:

我刚刚遇到了同样的问题,并找到了一种方法来全局通过将 Hibernate4Module 添加到映射器来正确映射休眠实体:

objectMapper.registerModule(
    new Hibernate4Module().configure(
        Hibernate4Module.Feature.FORCE_LAZY_LOADING, true));

【讨论】:

  • 我已经有了这个,但它不起作用。以下是我的代码:public HibernateAwareObjectMapper() { Hibernate5Module module = new Hibernate5Module(); module.enable(Hibernate5Module.Feature.FORCE_LAZY_LOADING); module.disable(Hibernate5Module.Feature.USE_TRANSIENT_ANNOTATION); registerModule(module); }
【解决方案4】:

似乎"handler": {}, "hibernateLazyInitializer": {} 属性似乎为空或为空。您可以使用以下配置忽略空或空属性。

mapper.setSerializationInclusion(JsonInclude.Include.NON_EMPTY);
mapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);

或者,如果您有权使用 @JsonIgnore 访问类注释 handlerhibernateLazyInitializer,这将阻止它被全局序列化。

【讨论】:

  • 我可以上课,但正如我在问题中提到的那样,我不想在课堂上使用该注释,因为我将不得不在我的许多课程上这样做,如果错过了一个,那会很痛苦.
  • mapper.setSerializationInclusion(JsonInclude.Include.NON_EMPTY); mapper.setSerializationInclusion(JsonInclude.Include.NON_NULL); 没有为我工作。
猜你喜欢
  • 2021-07-24
  • 2017-05-19
  • 1970-01-01
  • 2011-05-09
  • 2015-12-18
  • 2020-03-12
  • 2013-03-24
  • 2018-07-07
  • 1970-01-01
相关资源
最近更新 更多