java.lang.IllegalArgumentException: 结果映射集合不包含某个映射器的值

java.lang.IllegalArgumentException: Result Maps collection does not contain value for a certain mapper

我正在使用 MyBatis 开发一个应用程序,我遇到了一个非常奇怪的问题。
这已经在几天前发生了,但是通过在 dao-context2.xml 上取消注释以下 属性 我能够解决

    <!-- <property name="mapperLocations" value="classpath*:src/main/resources/**/*.xml" /> -->

然而,它又回来了,我无法通过它,即使该行是否被评论。

基本信息

table 的 DDL 如下(Oracle 风格)

CREATE TABLE "T_APPLICATION_STATUS" 
   (    "STATUS" VARCHAR2(100) NOT NULL ENABLE, 
    "DATA_UPDATE" TIMESTAMP (6)
   ) ;

映射到以下 Java Bean

public class ApplicationStatus  {

    private String lockStatus;

    private Date dataUpdate;

    public String getLockStatus() {
        return lockStatus;
    }

    public void setLockStatus(String lockStatus) {
        this.lockStatus = lockStatus;
    }

    public Date getDataUpdate() {
        return dataUpdate;
    }

    public void setDataUpdate(Date dataUpdate) {
        this.dataUpdate = dataUpdate;
    }
}

一切都映射在ApplicationStatusMapper.xml里面,定义如下

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
  

<mapper namespace="some.package.db.mappers.ApplicationStatusMapper">

    <resultMap type="some.package.db.model.ApplicationStatus" id="ApplicationStatus">
        <result property="lockStatus" column="STATUS"/> 
        <result property="dataUpdate" column="DATA_UPDATE"/> 
    </resultMap>
     
    <select id="getApplicationStatus" resultMap="ApplicationStatus">
     SELECT *
     FROM T_APPLICATION_STATUS
    </select> 
</mapper>

对应下面的Mapper Interface(Java flavor)

public interface ApplicationStatusMapper {
    
    @Update("UPDATE T_APPLICATION_STATUS "
            + "SET "
            + " STATUS = #{lockStatus}, "
            + " DATA_UPDATE = SYSDATE ")
    public void updateStatus(ApplicationStatus applicationStatus);

    @Select("SELECT STATUS AS lockStatus, DATA_UPDATE as dataUpdate FROM T_APPLICATION_STATUS")
    public ApplicationStatus getApplicationStatus();
    
}

所有这些都映射到 dao-context2.xml

中的这个片段
<?xml version="1.0" encoding="UTF-8"?>
<!-- Configures the Dao Context -->

<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="
        http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">

    <bean id="stringTrimmingTypeHandler" class="some.package.db.handler.StringTrimmingTypeHandler"/>

    <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
        <property name="dataSource" ref="dataSource" />
        <property name="typeHandlers" ref="stringTrimmingTypeHandler" />
        <property name="configLocation" value="classpath:mybatis-config.xml" />
        <!-- tolto il commento a mapperLocations perchè la query getMaxId() - SELECT_LAST_ID in TrasferimentoFondiMapper.java non funzionava -->
        <!-- <property name="mapperLocations" value="classpath*:src/main/resources/**/*.xml" /> -->
    </bean>

        <bean id="applicationStatusMapper" class="org.mybatis.spring.mapper.MapperFactoryBean">
        <property name="mapperInterface" value="some.package.db.mappers.ApplicationStatusMapper" />
        <property name="sqlSessionFactory" ref="sqlSessionFactory" />
    </bean>

    <bean id="datiAperturaContoMapper" class="org.mybatis.spring.mapper.MapperFactoryBean">
        <property name="mapperInterface" value="some.package.db.mappers.DatiAperturaContoMapper" />
        <property name="sqlSessionFactory" ref="sqlSessionFactory" />
    </bean>
</beans>

这是mybatis-config.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
    <settings>
        <setting name="jdbcTypeForNull" value="NULL" />
        <!-- <setting name="mapUnderscoreToCamelCase" value="true"/> -->
    </settings>
</configuration>

Pom 依赖项

    <dependency>
        <groupId>org.mybatis</groupId>
        <artifactId>mybatis</artifactId>
        <version>3.2.3</version>
    </dependency>
    <dependency>
        <groupId>org.mybatis</groupId>
        <artifactId>mybatis-spring</artifactId>
        <version>2.0.6</version>
    </dependency>

问题

当用户导航到应用程序时,它启动的第一个查询会爆炸。具体来说,第一个查询是检查应用程序是否处于维护状态。

Caused by: java.lang.IllegalArgumentException: Result Maps collection does not contain value for some.package.db.mappers.DatiAperturaContoMapper.DatiAperturaContoEX

在我的项目中,我确实有一些与 DatiAperturaContoMapper 和 DatiAperturaContoEX 相关的东西,但它们与 T_APPLICATION_STATUS 映射器没有任何关系。

结果是以下错误,在调用 ApplicationStatusMapper.java 时触发。遗憾的是,我也无法为 MyBatis 设置任何类型的日志记录。

我尝试过的东西

一些谷歌搜索建议我进行以下故障排除,但没有用:

  1. SQL T_APPLICATION_STATUS 语法(虽然一切看起来都很好)
  2. 指向加载所有内容的 mapperLocations(这似乎有效,但现在在部署时需要永远加载并导致 OOM 错误)

我正在寻找任何可以为我指明正确方向的建议。有人知道我可以从哪里开始吗?

好的,看来是我这边的失误。
至少根据我的理解,MyBatis 似乎不是在加载应用程序时加载 *Mapper.xml 文件,而是在执行第一个查询时加载。
在这种情况下,这个异常

Caused by: java.lang.IllegalArgumentException: Result Maps collection does not contain value for some.package.db.mappers.DatiAperturaContoMapper.DatiAperturaContoEX

告诉我 DatiAperturaContoMapper 的映射器存在一些错误。

具体来说,这导致以下

<resultMap id="DatiAperturaContoEx" type="some.package.db.model.DatiAperturaContoEx">
  my mapping...
</resultMap>


<select id="getDatiAperturaContoForAdempimenti" resultMap="DatiAperturaContoEX">
      my fancy query
</select>

错误出在 SELECT 中的引用中,最后的 X 是大写字母,而 ID 是 DatiAperturaContoEx 带有一个小 x