在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属性:
问题解决!