在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屬性:
問題解決!