Mybatis懒加载——返回前端数据 json序列化错误

原创 2018年04月15日 19:25:31

    先来个大家一大丢的错误

HTTP Status 500 - Request processing failed; nested exception is org.springframework.http.converter.HttpMessageConversionException: Type definition error: [simple type, class org.apache.ibatis.executor.loader.javassist.JavassistProxyFactory$EnhancedResultObjectProxyImpl]; nested exception is com.fasterxml.jackson.databind.exc.InvalidDefinitionException: No serializer found for class org.apache.ibatis.executor.loader.javassist.JavassistProxyFactory$EnhancedResultObjectProxyImpl and no properties discovered to create BeanSerializer (to avoid exception, disable SerializationFeature.FAIL_ON_EMPTY_BEANS) (through reference chain: com.ssm.model.domain.UserEntity_$$_jvstf7f_0["handler"])


背景:

mybatis级联查询,配置了懒加载模式,结果通过springMvc返回json时报的错。

推测:

因为不懂mybatis的源码怎么实现懒加载的,既然是通过用到懒加载部分,再去sql查询,那么肯定是json序列化的时候查询了,由于可能会用到mybatis的一些类,估计就json序列化失败了吧。

解决:

请忽略上面两步,直接百度就能解决了。哈哈哈哈。

在所有相关的类前加上@JsonIgnoreProperties, 作用是json序列化时忽略bean中的一些属性序列化和反序列化时抛出的异常.

@JsonIgnoreProperties(value = {"handler"})
public abstract class BaseEntity implements Serializable

问题篇

配置文件篇的cloumn指的是级联时传递过来的参数。

对于关联的collection的属性,一定是集合,否则mybatis会报查一条,却返回多条的错误。

看到这里就可以结束了,下面都是代码,算是本人的一个代码库。

代码篇

先说第一句话,好像mybatis在调试的情况下懒加载是不起作用的。反正我调试的时候不起作用。只有运行的时候起作用。

mapper配置篇

UserMapper配置

<resultMap type="com.ssm.model.domain.UserEntity" id="userMap"  >
        <id property="id" column="id"/>
        <result property="passWord" column="password"/>
        <result property="userName" column="username"/>
        <result property="email" column="email"/>
        <result property="created" column="created"/>
        <result property="updated" column="updated"/>
        <result property="phone" column="phone"/>
        <result property="sex" column="sex" typeHandler="com.ssm.mybatis.typehandler.SexEnumHandler"  />
        <association fetchType="lazy" property="bodyEntity" column="id"  select="com.ssm.dao.BodyMapper.findBodyByUserId">
        </association>
        <association fetchType="eager" property="cardEntity" column="id"  select="com.ssm.dao.CardMapper.findCardByUserId">
        </association>
        <collection property="scoreEntity" column="id"  select="com.ssm.dao.ScoreMapper.findScoreListByUserId">
        </collection>
    </resultMap>
    <select id="selectUserById" resultMap="userMap" >
        select * from tb_user where id = #{id}
    </select>

BodyMapper配置

<resultMap id="bodyMap" type="com.ssm.model.domain.BodyEntity">
        <id property="id" column="id"/>
        <result property="userId" column="user_id"/>
        <result property="userName" column="user_name"/>
        <result property="height" column="height"/>
        <result property="pullUp" column="pull_up"/>
        <result property="pulmonary" column="pulmonary"/>
    </resultMap>

    <select id="findBodyByUserId" resultMap="bodyMap">
        SELECT  * from tb_body
        where user_id = #{id}
    </select>

ScoreMapper配置

    <resultMap id="scoreMap" type="com.ssm.model.domain.ScoreEntity">
        <id property="id" column="id"/>
        <result property="userName" column="user_name"/>
        <result property="userName" column="user_name"/>
        <result property="score" column="score"/>
        <result property="userId" column="user_id"/>
    </resultMap>

<select id="findScoreListByUserId" resultMap="scoreMap">
    SELECT  * from tb_score
    where user_id = #{userId}
</select>

CardMapper配置

 <resultMap id="cardMap" type="com.ssm.model.domain.CardEntity">
        <id property="id" column="id"/>
        <result property="userId" column="user_id"/>
        <result property="userName" column="user_name"/>
        <result property="note" column="note"/>
        <result property="grade" column="grade"/>
    </resultMap>
    
    <select id="findCardByUserId" resultType="card">
        SELECT  * from tb_card
        where user_id = #{id}
    </select>

Service代码

 @Override
    public UserEntity selectUserById(Long userId) {
        String resource = "mybatis-config.xml";
        SqlSessionFactory sqlSessionFactory=null;
        SqlSession session = null;
        UserEntity userEntity = null;
        try{
            InputStream in = new ClassPathResource(resource).getInputStream();
            //创建单例工厂
            sqlSessionFactory = new SqlSessionFactoryBuilder().build(in);
            session = sqlSessionFactory.openSession();
            XmlMybatisTest xmlMybatisTest = new XmlMybatisTest();
            userEntity=xmlMybatisTest.testMapper(session);
            session.commit();
        }catch (Exception e){
            e.printStackTrace();
        }finally{
            if(session!= null){
                session.close();
            }
        }
        return userEntity;
    }




版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/wgp15732622312/article/details/79951977

jQuery高级篇 第三章 jQuery中使用JSON与XML数据

主讲内容: 第一讲 JSON数据的基础知识 第二讲 jQuery读取JSON数据 第三讲 jQuery遍历JSON数据 第四讲 jQuery操作JSON数据 第五讲 jQuery解析XML数据 第六讲 jQuery操作服务端JSON数据
  • 2017年04月15日 15:25

返回JSON数据,懒加载异常的处理

利用hibernate取数据,会遇到数据懒加载的问题,性能不高不说,有时候还会发生异常 下面给出解决方法 : 1、自定义 ObjectMapper  public class HibernateA...
  • ltaihyy
  • ltaihyy
  • 2016-07-19 17:55:48
  • 2023

springmvc 集成 mybatis 使用懒加载后,返回JSON报错

参考资料:http://m.blog.csdn.net/article/details?id=51236938 解决方案 为SpringMVC里默认序列化使用的 com.faster...
  • justinytsoft
  • justinytsoft
  • 2016-12-11 20:49:14
  • 2670

ssh三大框架整合后struts2返回json数据出现懒加载异常

这个项目我用到了spring 的OpenSessionInView过滤器,使得发起一个页面请求时就打开Hibernate的Session,一直保持这个Session,直到这个请求结束,这样可以避免很多...
  • qq_22498277
  • qq_22498277
  • 2016-08-12 16:01:29
  • 806

解决因为hibernate的懒加载引起的json 序列化失败的问题

在使用hibernate的过程中,  对于某些关联的属性对象 有进行懒加载的操作,   这时如果存在懒加载的对象,进行json序列化的时候,会报错。 可以使用一个过滤器,进行 过滤不需要被序列化的属...
  • qq_35551089
  • qq_35551089
  • 2017-02-04 10:13:24
  • 364

Spring MVC返回hibernate对象序列化json报懒加载出错的问题

在懒加载的字段上加上JsonIgnore注解 例如 @JsonIgnore @OneToMany(cascade = CascadeType.PERSIST, fetch = Fetc...
  • RO_wsy
  • RO_wsy
  • 2015-07-27 10:20:56
  • 1602

spring data jpa 懒加载的json序列号的解决方法

实例映射时,在ajax访问返回json字符串的时候,会出现子集无法序列号的错误,没有找到通过配置解决的方法,看别人有用Map转换一下的解决思路,照做如下,可以解决问题 Operator operato...
  • wyljz
  • wyljz
  • 2016-09-26 16:42:16
  • 1031

转换json关联集合运行时出现懒加载问题解决方案

转换json 关联集合问题 运行时出现问题:出现懒加载异常   问题原因   如果需要将集合数据转换为json返回  第一种:在get方法上添加@JSON(Serialize=fals...
  • shengjieadmin
  • shengjieadmin
  • 2017-11-06 14:06:38
  • 66

关于使用json数据传递的时候hibernate的懒加载问题

我在使用json传递数据的时候,常常会遇到问题,就是数据库映射的实体和文件里面会有一些外键映射成实体对象成为实体的属性。如果我们通过hibernate查询数据库,返回数据,那么这些实体的数据是不会序列...
  • li951383937
  • li951383937
  • 2016-06-21 11:01:10
  • 935

mybatis懒加载机制生效的陷阱

转自:http://liu400liu.iteye.com/blog/1199673 一些刚接触mybatis的人如果之前用过hibernate,总想试试它的延迟加载功能,其实在实际开发中我从来没有...
  • qq915697213
  • qq915697213
  • 2015-02-27 10:21:08
  • 961
收藏助手
不良信息举报
您举报文章:Mybatis懒加载——返回前端数据 json序列化错误
举报原因:
原因补充:

(最多只允许输入30个字)