开发者社区 问答 正文

SpringBoot整合JPA/Hibernate报错

No serializer found for class org.hibernate.proxy.pojo.javassist.JavassistLazyInitializer and no properties discovered to create BeanSerializer (to avoid exception, disable SerializationConfig.Feature.FAIL_ON_EMPTY_BEANS)

展开
收起
佚名4918 2021-10-19 17:37:51 1133 分享 版权
阿里云 AI 助理回答

您遇到的错误信息是No serializer found for class org.hibernate.proxy.pojo.javassist.JavassistLazyInitializer and no properties discovered to create BeanSerializer,这通常是因为在进行对象序列化时,Jackson库没有找到对应Hibernate代理类的序列化器。当尝试将一个包含懒加载属性(由Hibernate生成的代理对象)的实体转换为JSON时,Jackson会抛出此异常,因为它默认要求序列化的类必须有可访问的属性或方法。

解决方案:

  1. 禁用FAIL_ON_EMPTY_BEANS特性: 在配置Jackson的ObjectMapper时,可以禁用SerializationConfig.Feature.FAIL_ON_EMPTY_BEANS特性,允许空构造函数或无公共属性/getter/setter的类被序列化。示例代码如下:

    ObjectMapper mapper = new ObjectMapper();
    mapper.configure(SerializationFeature.FAIL_ON_EMPTY_BEANS, false);
    
  2. 使用 Hibernate5Module: 为了更优雅地处理Hibernate代理对象和懒加载问题,推荐使用Hibernate5Module与Jackson集成。这将自动处理Hibernate特定的序列化问题。添加以下代码到您的应用启动或配置部分:

    import com.fasterxml.jackson.databind.ObjectMapper;
    import com.fasterxml.jackson.datatype.hibernate5.Hibernate5Module;
    
    // ...
    ObjectMapper mapper = new ObjectMapper();
    Hibernate5Module module = new Hibernate5Module();
    // 配置模块以适应你的需求,例如:module.configure(Feature.FORCE_LAZY_LOADING, true);
    mapper.registerModule(module);
    

    这段代码注册了一个针对Hibernate 5的模块到Jackson的ObjectMapper中,它能智能处理Hibernate的懒加载代理对象,避免直接序列化这些代理类导致的问题。

  3. 显式访问实际对象: 在某些情况下,你可能需要在序列化前显式地初始化并获取实体的实际对象,而非其代理。可以通过触发相关属性的加载来实现,例如调用相关getter方法。

通过上述任一方法,您应该能够解决序列化Hibernate代理对象时遇到的No serializer found问题。如果问题依然存在,建议检查实体类的映射配置以及确保所有相关的依赖版本兼容性良好。

有帮助
无帮助
AI 助理回答生成答案可能存在不准确,仅供参考
0 条回答
写回答
取消 提交回答