Mybatis中第一次遇到这个问题,做个笔记!
No constructor found in com.mybatis.bean.Mybean$InnerBean matching [java.lang.String, java.lang.String]
### Cause: org.apache.ibatis.executor.ExecutorException: No constructor found in com.mybatis.bean.Mybean$InnerBeanmatching [java.lang.String, java.lang.String]
at org.apache.ibatis.exceptions.ExceptionFactory.wrapException(ExceptionFactory.java:30)
at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:150)
at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:141)
at org.apache.ibatis.session.defaults.DefaultSqlSession.selectOne(DefaultSqlSession.java:77)
at com.mybatis.test4.Test4.main(Test4.java:15)
Caused by: org.apache.ibatis.executor.ExecutorException: No constructor found in com.mybatis.bean.Mybean$InnerBean matching [java.lang.String, java.lang.String]
at org.apache.ibatis.executor.resultset.DefaultResultSetHandler.createByConstructorSignature(DefaultResultSetHandler.java:656)
at org.apache.ibatis.executor.resultset.DefaultResultSetHandler.createResultObject(DefaultResultSetHandler.java:605)
at org.apache.ibatis.executor.resultset.DefaultResultSetHandler.createResultObject(DefaultResultSetHandler.java:578)
at org.apache.ibatis.executor.resultset.DefaultResultSetHandler.getRowValue(DefaultResultSetHandler.java:383)
at org.apache.ibatis.executor.resultset.DefaultResultSetHandler.handleRowValuesForSimpleResultMap(DefaultResultSetHandler.java:342)
at org.apache.ibatis.executor.resultset.DefaultResultSetHandler.handleRowValues(DefaultResultSetHandler.java:317)
at org.apache.ibatis.executor.resultset.DefaultResultSetHandler.handleResultSet(DefaultResultSetHandler.java:290)
at org.apache.ibatis.executor.resultset.DefaultResultSetHandler.handleResultSets(DefaultResultSetHandler.java:187)
at org.apache.ibatis.executor.statement.PreparedStatementHandler.query(PreparedStatementHandler.java:64)
at org.apache.ibatis.executor.statement.RoutingStatementHandler.query(RoutingStatementHandler.java:79)
at org.apache.ibatis.executor.SimpleExecutor.doQuery(SimpleExecutor.java:63)
at org.apache.ibatis.executor.BaseExecutor.queryFromDatabase(BaseExecutor.java:324)
at org.apache.ibatis.executor.BaseExecutor.query(BaseExecutor.java:156)
at org.apache.ibatis.executor.CachingExecutor.query(CachingExecutor.java:109)
at org.apache.ibatis.executor.CachingExecutor.query(CachingExecutor.java:83)
at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:148)
查找了很多资料,大部分结果可以分为两种:
一、实体类中没有使用内部类
这种情况下,其实就是重写了构造器后,忘了补写一个默认的构造器了。此类的错误还经常出现在spring等这种大量使用反射的框架中。因为这些框架在调用反射的类后会默认调用默认的构造器。
二、使用内部类,Mybatis.xml中返回类型为内部类
记录一下内部类在xml中写法
<select id="selectAll" resultType="com.mybatis.bean.Mybean$InnerBean"> select id, name from user </select>
使用“$”去分割内部类与外部类,而不是“.”
2. 此时如果出现此异常
Collection标签使用内部类,该内部类必须为静态内部类
非静态内部类依赖外部类实例,所以报错No constructor found in matching [java.lang.Long, java.lang.String,关于内部类反射可以参考http://blog.csdn.net/ldstartnow/article/details/52782420,不过并不是必须要显式构造函数
public class Mybean {
private String age;
private String old;
// 添加该内部类为静态内部类, 否则反射会出现异常
public static class Bean{
private String id;
private String name;
}
版权声明:本文为lgc592519828原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。