1. 程式人生 > 其它 >mybatis的級聯查詢-懶載入遇到的序列化問題

mybatis的級聯查詢-懶載入遇到的序列化問題

不獲取子查詢的屬性就不會觸發子查詢

例如:

    @RequestMapping(value = "/searchTravelTemplateById1", method = RequestMethod.GET)
    public void searchTravelTemplateById1(Integer id, HttpServletResponse response) {
        TourElectronicTravelTemplate travelTemplate = travelTemplateService.queryTravelTemplateById(id);
    }

如果有返回值,並且要序列化就會觸發子查詢,會使用同步查詢所有結果,會有 N+1 問題

    @RequestMapping(value = "/searchTravelTemplateById1", method = RequestMethod.GET)
    public TourElectronicTravelTemplate searchTravelTemplateById1(Integer id, HttpServletResponse response) {
        TourElectronicTravelTemplate travelTemplate = travelTemplateService.queryTravelTemplateById(id);
        
return travelTemplate; }

可能會出現一個bug:

2021-06-24 13:54:17.414 ----> [http-nio-8080-exec-1] ---> ERROR o.a.c.c.C.[.[localhost].[/].[dispatcherServlet] - Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [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.tuniu.data.entity.vo.ResponseVo["data"]->com.tuniu.data.travle.entity.TourElectronicTravelTemplate_$$_jvste21_0["handler"])] with root cause 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.tuniu.data.entity.vo.ResponseVo["data"]->com.tuniu.data.travle.entity.TourElectronicTravelTemplate_$$_jvste21_0["handler"])

可以在要返回的實體類屬性上加入註解:

@JsonIgnoreProperties(value = {"handler"})
例如:
@JsonIgnoreProperties(value = {"handler"})
public class TourElectronicTravelTemplate {

在此標記不生成json物件的屬性

因為jsonplugin用的是java的內審機制.hibernate會給被管理的pojo加入一個handler 屬性,jsonplugin會把 handler 也拿出來操作,並讀取裡面一個不能被反射操作的屬性就產生了這個異常.