1. Reproducir el error
Mensaje de error:
13:41:33.539 ERROR com.fast.framework.advice.FastBootControllerAdvice 58 errorHandler - Could not find result map java.util.List org.apache.ibatis.builder.IncompleteElementException: Could not find result map java.util.List
at org.apache.ibatis.builder.MapperBuilderAssistant.getStatementResultMaps(MapperBuilderAssistant.java:346) ~[mybatis-3.5.0.jar:3.5.0]
at org.apache.ibatis.builder.MapperBuilderAssistant.addMappedStatement(MapperBuilderAssistant.java:290) ~[mybatis-3.5.0.jar:3.5.0]
at org.apache.ibatis.builder.xml.XMLStatementBuilder.parseStatementNode(XMLStatementBuilder.java:109) ~[mybatis-3.5.0.jar:3.5.0]
at org.apache.ibatis.session.Configuration.lambda$buildAllStatements$2(Configuration.java:787) ~[mybatis-3.5.0.jar:3.5.0]
at java.util.Collection.removeIf(Collection.java:414) ~[?:1.8.0_112]
at org.apache.ibatis.session.Configuration.buildAllStatements(Configuration.java:786) ~[mybatis-3.5.0.jar:3.5.0]
at org.apache.ibatis.session.Configuration.hasStatement(Configuration.java:763) ~[mybatis-3.5.0.jar:3.5.0]
at org.apache.ibatis.session.Configuration.hasStatement(Configuration.java:758) ~[mybatis-3.5.0.jar:3.5.0]
at com.baomidou.mybatisplus.core.override.MybatisMapperMethod$SqlCommand.resolveMappedStatement(MybatisMapperMethod.java:264) ~[mybatis-plus-core-3.1.0
2. Fondo
En primer lugar, vaya al sitio web oficial para confirmar que el uso de resultMap y resultType es correcto. Este artículo no analiza el uso básico, por lo tanto, los errores después de usar myabtis de manera competente
Sitio web oficial: http://www.mybatis.org/mybatis-3/zh/sqlmap-xml.html#select
3. Recupera la escena
(1) La capa de Dao tiene dos métodos, recuerde que estos dos rápidos son normales y la prueba es incorrecta
int selectFast();
int selectTest();
(2) Correspondiente a xml, donde selectTest es problemático, resultMap = "java.util.List" es incorrecto para escribir
<select id="selectFast" resultType="java.lang.Integer">
select count(1) from sys_user
</select>
<select id="selectTest" resultMap="java.util.List">
select count(1) from sys_user
</select>
(3) Entonces solo llamo al método normal int selectFast ();
masterDao.selectFast()
(4) La limpieza, la instalación y el paquete normales de maven son todos normales
(5) Después de compilar e iniciar, también se inicia normalmente
(6) Luego, cuando se llama al método normal selectFast a través del controlador, se informa el error inicial
No se pudo encontrar el mapa de resultados java.util.List
(7) Similar a este error, habrá una pista donde ocurrió el error. La pista de este error es:
en com.fast.web.controller.TestController.getString (TestController.java:25) ~ [clases / :?]
Esta es la línea 25 de este TestController, también llamé a este método, es razonable decir
(8) ¿Pero cuál es el problema incorrecto?
El método int selectFast () al que estoy llamando actualmente es normal. No hay ningún problema con el código y la interfaz de llamada es solo este método, por lo que el código debería ejecutarse normalmente.
Pero mybatis devolvió un error, devolviendo un método (int selectTest ();) que era irrelevante para la llamada de la interfaz en ese momento. Sin embargo, este error no reportó un error durante la fase de compilación y la fase de inicio. Al llamar a otros métodos, se solicita el error de este método y la posición del error es la posición del método correcto.
Idea : Primero resuelva el problema, luego aclare el problema, corrija directamente el error del método irrelevante, modifique de la siguiente manera, el método int selectTest (); el método es normal, y la solicitud para volver a visitar es normal.
<select id="selectTest" resultType="java.lang.Integer">
select count(1) from sys_user
</select>
La solución en ese momento era la depuración : debido al método normal que solicité, el parámetro de retorno debería ser resultType, pero ¿de dónde vino este resultMap y también reportó un error? Mire la ubicación del mensaje de error mostrado por mybatis.
14:04:46.787 ERROR com.fast.framework.advice.FastBootControllerAdvice 58 errorHandler - Could not find result map java.util.List org.apache.ibatis.builder.IncompleteElementException: Could not find result map java.util.List
at org.apache.ibatis.builder.MapperBuilderAssistant.getStatementResultMaps(MapperBuilderAssistant.java:346) ~[mybatis-3.5.0.jar:3.5.0]
at org.apache.ibatis.builder.MapperBuilderAssistant.addMappedStatement(MapperBuilderAssistant.java:290) ~[mybatis-3.5.0.jar:3.5.0]
at org.apache.ibatis.builder.xml.XMLStatementBuilder.parseStatementNode(XMLStatementBuilder.java:109) ~[mybatis-3.5.0.jar:3.5.0]
at org.apache.ibatis.session.Configuration.lambda$buildAllStatements$2(Configuration.java:787) ~[mybatis-3.5.0.jar:3.5.0]
at java.util.Collection.removeIf(Collection.java:414) ~[?:1.8.0_112]
Busque esto (XMLStatementBuilder.java:109) y cree un punto de interrupción. A continuación se muestra el código fuente de mybatis. El punto de interrupción se coloca en la última línea.
Vuelva a solicitar, vea los parámetros de resultMap enviados
public void parseStatementNode() {
String id = this.context.getStringAttribute("id");
String databaseId = this.context.getStringAttribute("databaseId");
if (this.databaseIdMatchesCurrent(id, databaseId, this.requiredDatabaseId)) {
Integer fetchSize = this.context.getIntAttribute("fetchSize");
Integer timeout = this.context.getIntAttribute("timeout");
String parameterMap = this.context.getStringAttribute("parameterMap");
String parameterType = this.context.getStringAttribute("parameterType");
Class<?> parameterTypeClass = this.resolveClass(parameterType);
String resultMap = this.context.getStringAttribute("resultMap");
String resultType = this.context.getStringAttribute("resultType");
String lang = this.context.getStringAttribute("lang");
LanguageDriver langDriver = this.getLanguageDriver(lang);
Class<?> resultTypeClass = this.resolveClass(resultType);
String resultSetType = this.context.getStringAttribute("resultSetType");
StatementType statementType = StatementType.valueOf(this.context.getStringAttribute("statementType", StatementType.PREPARED.toString()));
ResultSetType resultSetTypeEnum = this.resolveResultSetType(resultSetType);
String nodeName = this.context.getNode().getNodeName();
SqlCommandType sqlCommandType = SqlCommandType.valueOf(nodeName.toUpperCase(Locale.ENGLISH));
boolean isSelect = sqlCommandType == SqlCommandType.SELECT;
boolean flushCache = this.context.getBooleanAttribute("flushCache", !isSelect);
boolean useCache = this.context.getBooleanAttribute("useCache", isSelect);
boolean resultOrdered = this.context.getBooleanAttribute("resultOrdered", false);
XMLIncludeTransformer includeParser = new XMLIncludeTransformer(this.configuration, this.builderAssistant);
includeParser.applyIncludes(this.context.getNode());
this.processSelectKeyNodes(id, parameterTypeClass, langDriver);
SqlSource sqlSource = langDriver.createSqlSource(this.configuration, this.context, parameterTypeClass);
String resultSets = this.context.getStringAttribute("resultSets");
String keyProperty = this.context.getStringAttribute("keyProperty");
String keyColumn = this.context.getStringAttribute("keyColumn");
String keyStatementId = id + "!selectKey";
keyStatementId = this.builderAssistant.applyCurrentNamespace(keyStatementId, true);
Object keyGenerator;
if (this.configuration.hasKeyGenerator(keyStatementId)) {
keyGenerator = this.configuration.getKeyGenerator(keyStatementId);
} else {
keyGenerator = this.context.getBooleanAttribute("useGeneratedKeys", this.configuration.isUseGeneratedKeys() && SqlCommandType.INSERT.equals(sqlCommandType)) ? Jdbc3KeyGenerator.INSTANCE : NoKeyGenerator.INSTANCE;
}
this.builderAssistant.addMappedStatement(id, sqlSource, statementType, sqlCommandType, fetchSize, timeout, parameterMap, parameterTypeClass, resultMap, resultTypeClass, resultSetTypeEnum, flushCache, useCache, resultOrdered, (KeyGenerator)keyGenerator, keyProperty, keyColumn, databaseId, langDriver, resultSets);
}
}
Luego verifique los parámetros de depuración, mi solicitud de interfaz es selectFast (), un método normal, pero ahora también verifiqué selectTest (); este método problemático.
resultMap devuelve java.util.List
Así que busque el método selectTest globalmente, modifique los parámetros de retorno y complete la corrección del error.
Resumen : Este error no es un error complicada, ni un error significativo, ..., Pero mybatis compila y se inicia sin informar de un error Cuando se solicita una interfaz normal, se informa de un error de un método irrelevante Esta ubicación inmediata es problemático , se hacer que pierda mucho tiempo en la resolución de problemas Primero recuerde que habrá este problema, y evitará un hoyo en el futuro.