封装BO并继承DO,进行Mybatis级联查询出现jackson解析异常

问题描述

在使用Mybatis进行级联查询,尤其是在进行一对一、一对多和多对多的情况下,为了规范化,往往不在DO实体类里直接封装不属于数据库的实体属性(虽然可以忽略),所以一般会进行封装BO,更多情况下BO会直接继承DO。
但是在使用Mybatis进行级联查询,以BO为返回的数据类型是,会报jackson的解析异常(springboot默认的json解析工具)。

报错信息如下:

ERROR c.x.e.handler.GlobalExceptionHandler - Type definition error: [simple type, class 
org.apache.ibatis.executor.loader.javassist.JavassistProxyFactory$EnhancedResultObjectPro
xyImpl]; nested exception is com.fasterxml.jackson.databind.exc.InvalidDefinitionException: No serializer found for 
class 
org.apache.ibatis.executor.loader.javassist.JavassistProxyFactory$EnhancedResultObjectPro
xyImpl and no properties discovered to create BeanSerializer (to avoid exception, disable 
SerializationFeature.FAIL_ON_EMPTY_BEANS) (through reference chain: 
com.xiaoyun.response.ResponseResult["data"]-
>com.xiaoyun.api.bo.ObjectDetailsBO_$$_jvst744_0["handler"])

问题解决

Mybatis底层在处理级联查询时,会给JavaBean添加handle属性,之后Jackson在对该代理类做序列化时,由于找不到对应的getter,异常就抛出来。

解决办法:
在实体类添加如下注解即可解决:

@JsonIgnoreProperties(value = "handler")

作用:
让Jackson序列化时忽略handler属性

附:@JsonIgnore和@JsonIgnoreProperties的使用

@JsonIgnore注解用来忽略某些字段,可以用在Field或者Getter方法上,用在Setter方法时,和Filed效果一样。

@JsonIgnoreProperties(ignoreUnknown = true),将这个注解写在类上之后,就会忽略类中不存在的字段。这个注解还可以指定要忽略的字段。使用方法如下:

@JsonIgnoreProperties({ “internalId”, “secretKey” })
指定的字段不会被序列化和反序列化。

你可能感兴趣的:(SSM,mybatis,jackson解析异常)