好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

Mybatis collection查询集合属性报错的解决方案

Mybatis collection查询集合属性报错

错误日志

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

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.hexagonsi.sandtablebackendservice.controller.viewModel.ReturnResult[ "data" ]->java.util.ArrayList[ 0 ]->com.hexagonsi.sandtablebackendservice.model.AreaBean_$$_jvstc74_0[ "handler" ])

     at org.springframework.http.converter.json.AbstractJackson2HttpMessageConverter.writeInternal(AbstractJackson2HttpMessageConverter.java: 303 )

     at org.springframework.http.converter.AbstractGenericHttpMessageConverter.write(AbstractGenericHttpMessageConverter.java: 104 )

     at org.springframework.web.servlet.mvc.method.annotation.AbstractMessageConverterMethodProcessor.writeWithMessageConverters(AbstractMessageConverterMethodProcessor.java: 287 )

     at org.springframework.web.servlet.mvc.method.annotation.HttpEntityMethodProcessor.handleReturnValue(HttpEntityMethodProcessor.java: 226 )

     at org.springframework.web.method.support.HandlerMethodReturnValueHandlerComposite.handleReturnValue(HandlerMethodReturnValueHandlerComposite.java: 82 )

     at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java: 124 )

     at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java: 879 )

     at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java: 793 )

     at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java: 87 )

     at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java: 1040 )

     at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java: 943 )

     at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java: 1006 )

     at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java: 898 )

     at javax.servlet.http.HttpServlet.service(HttpServlet.java: 634 )

     at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java: 883 )

     at javax.servlet.http.HttpServlet.service(HttpServlet.java: 741 )

     at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java: 231 )

     at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java: 166 )

     at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java: 53 )

     at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java: 193 )

     at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java: 166 )

     at org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java: 61 )

     at org.apache.shiro.web.servlet.AdviceFilter.executeChain(AdviceFilter.java: 108 )

     at org.apache.shiro.web.servlet.AdviceFilter.doFilterInternal(AdviceFilter.java: 137 )

     at org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java: 125 )

     at org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java: 66 )

     at org.apache.shiro.web.servlet.AbstractShiroFilter.executeChain(AbstractShiroFilter.java: 449 )

     at org.apache.shiro.web.servlet.AbstractShiroFilter$ 1 .call(AbstractShiroFilter.java: 365 )

     at org.apache.shiro.subject.support.SubjectCallable.doCall(SubjectCallable.java: 90 )

     at org.apache.shiro.subject.support.SubjectCallable.call(SubjectCallable.java: 83 )

     at org.apache.shiro.subject.support.DelegatingSubject.execute(DelegatingSubject.java: 387 )

     at org.apache.shiro.web.servlet.AbstractShiroFilter.doFilterInternal(AbstractShiroFilter.java: 362 )

     at org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java: 125 )

     at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java: 193 )

     at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java: 166 )

     at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java: 100 )

     at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java: 119 )

     at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java: 193 )

     at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java: 166 )

     at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java: 93 )

     at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java: 119 )

     at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java: 193 )

     at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java: 166 )

     at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java: 201 )

     at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java: 119 )

     at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java: 193 )

     at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java: 166 )

     at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java: 202 )

     at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java: 96 )

     at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java: 541 )

     at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java: 139 )

     at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java: 92 )

     at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java: 74 )

     at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java: 343 )

     at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java: 367 )

     at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java: 65 )

     at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java: 868 )

     at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java: 1639 )

     at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java: 49 )

     at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java: 1142 )

     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java: 617 )

     at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java: 61 )

     at java.lang.Thread.run(Thread.java: 745 )

背景

使用collection查询集合属性数据

排查

如下图,发现在查询数据后,实体类中自动添加了一个[handler]属性,该属性是没有对应的set/get方法

解决方法

在结合属性所在的类上添加注解:转json时,忽略自动产生的handler属性

?

1

@JsonIgnoreProperties (value = { "handler" })

用以在json序列化时忽略bean中一些不需要转化的属性

MyBatis 包含属性为集合的查询

父实体类

?

1

2

3

4

5

public class MerchantsVO {

     private Integer id;

     private String name;

     private List<PaymentAccountVO> paymentAccountList;

}

关联子查询实体类

?

1

2

3

4

public class PaymentAccountVO {

     private Integer id;

     private Integer merchantsId;

}

父查询返回结果实体类映射

?

1

2

3

4

5

6

7

8

< resultMap id = "merchantsResultMap" type = "com.entity.vo.MerchantsVO" >               

         < result property = "id" column = "id" />

         < result property = "name" column = "name" />

         < collection property = "paymentAccountList" ofType = "com.entity.vo.PaymentAccountVO"

    column = "id" select = "getPaymentAccountByMerchantsId" fetchType = "eager" >

         </ collection >

</ resultMap >

      < collection >标签中的  column="id" , 对应为父实体类数据库映射字段,用于关联子查询

集合子查询实体类映射

?

1

2

3

4

5

< resultMap id = "paymentAccountResultMap" type = "com.entity.vo.PaymentAccountVO" >

      <!-- 定义这个集合中元素的封装规则 -->

         < result property = "id" column = "id" />

         < result property = "merchantsId" column = "merchants_id" />

</ resultMap >

父查询

?

1

2

3

< select id = "getMerchantsVOList" resultMap = "merchantsResultMap" >

     SELECT m.* FROM merchants m

</ select >

子查询

?

1

2

3

< select id = "getPaymentAccountByMerchantsId" resultMap = "paymentAccountResultMap" >

     SELECT * FROM payment_account WHERE merchants_id = #{id}

</ select >

以上为个人经验,希望能给大家一个参考,也希望大家多多支持。

原文链接:https://blog.csdn.net/xiulongshan/article/details/109238605

查看更多关于Mybatis collection查询集合属性报错的解决方案的详细内容...

  阅读:27次