当mybatis返回值遇见内部类的问题
作者:三省同学
背景
使用mybatis返回内部类时,无法点击过去,启动报错
Caused by: org.apache.ibatis.type.TypeException: Could not resolve type alias 'com.XXX.A$B'.
Cause: java.lang.ClassNotFoundException: Cannot find class: com.XXX.A$B
at org.apache.ibatis.type.TypeAliasRegistry.resolveAlias(TypeAliasRegistry.java:120)
at org.apache.ibatis.builder.BaseBuilder.resolveAlias(BaseBuilder.java:149)
at org.apache.ibatis.builder.BaseBuilder.resolveClass(BaseBuilder.java:116)
... 65 common frames omitted
解决方案
如果B类是A类中的内部类:
映射写法:resultType=" com.XXX.A$B">
A类和B类之间用 $表示内外关系,不用的.。
同时,内部类需用内static修饰:
@Data public class A { Long value; String label; List<B> children; /** * 内部类 */ @Data public static class B { Long value; String label; List<C> children; } /** * 内部类 */ @Data public static class C { Long value; String label; } }
为什么要用static
如果未加static,启动时不会报错,但是请求方法时会报如下错误:
Caused by: org.apache.ibatis.executor.ExecutorException:
No constructor found in com.XXX.A$B matching
[java.lang.Long, java.lang.String, java.lang.Long, java.lang.String, java.lang.Long, java.lang.String]
未匹配到构造器
静态内部类和内部类区别
Oracle官方的说法:
Terminology: Nested classes are divided into two categories: static and non-static. Nested classes that are declared static are called static nested classes. Non-static nested classes are called inner classes.
从字面上看,一个被称为静态嵌套类,一个被称为内部类。 从字面的角度解释是这样的:
- 什么是嵌套?嵌套就是我跟你没关系,自己可以完全独立存在。
- 什么是内部?内部就是我是你的一部分,我了解你,我知道你的全部,没有你就没有我。(所以内部类对象是以外部类对象存在为前提的)
至于具体的使用场景见官网:
http://docs.oracle.com/javase/tutorial/java/javaOO/nested.html
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。