Mybatis懒加载时,springMVC返回JSON异常 Could not write JSON: No serializer found for class org.apache.ibatis
Posted 橘子柠檬
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Mybatis懒加载时,springMVC返回JSON异常 Could not write JSON: No serializer found for class org.apache.ibatis相关的知识,希望对你有一定的参考价值。
在mybatis集成springmvc时,假如mybatis采用了懒加载,而springmvc中利用@ResponseBody注解返回实体类的JSON时会抛异常:
Could not write JSON: 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);
先看出现问题的代码:
首先是controller中返回的是responsebody:
/** * 根据订单ID查询订单 * @param orderId * @return */ @ResponseBody @RequestMapping(value = "/query/{orderId}" ,method = RequestMethod.GET) public Order queryOrderById(@PathVariable("orderId") String orderId) { return orderService.queryOrderById(orderId); }
service中的代码:
public Order queryOrderById(String orderId) { Order order = orderDao.queryOrderById(orderId); return order; }
public Order queryOrderById(String orderId) { return this.orderMapper.queryByID(orderId); }
调用的mapper.xml中使用了懒加载:
<resultMap type="Order" id="pojoResultMap" autoMapping="true"> <id column="order_id" property="orderId"/> <association property="orderShipping" javaType="OrderShipping" column="order_id" select="queryOrderShippingByOrderId" autoMapping="true" fetchType="lazy"></association> <collection property="orderItems" javaType="Arraylist" ofType="OrderItem" autoMapping="true" select="queryOrderItemByOrderId" column="order_id" fetchType="lazy"> </collection> </resultMap>
这个时候测试就会上面的异常.
经过调试后发现,原来service中执行过queryByID的方法后,返回的实体类Order被做了代理,如下:
可以看到,被代理后的Order类多了一个handler的属性,之后Jackson在对该代理类做序列化时,由于找不到对应的getter,异常就抛出来辣!
解决方法:
在被代理的Order类上加上 @JsonIgnoreProperties(value = "handler") 注解,让Jackson序列化时忽略handler属性:
问题解决!
以上是关于Mybatis懒加载时,springMVC返回JSON异常 Could not write JSON: No serializer found for class org.apache.ibatis的主要内容,如果未能解决你的问题,请参考以下文章