背景

使用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

## 扩展

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐