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

标签 java xml spring oracle mybatis

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

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

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

基本信息

该表的 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. T_APPLICATION_STATUS 上的 SQL 语法(虽然一切看起来都很好)
  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 是带有小 x 的 DatiAperturaContoEx

关于java.lang.IllegalArgumentException : Result Maps collection does not contain value for a certain mapper 异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66429954/

相关文章:

xml - XPath:如何检查属性是否存在?

spring - 我们是否需要 xml 文件来使用 Annotation 进行 Spring 配置?

spring - 从 Spring/MongoDB findAndModify 返回新旧实体

java - 如何禁用在 Spring 中使用 @Component 注释创建 bean?

java - ArrayList最后为null

java - 提取计划作业的运行时间时出现问题

java - 一个属性不存在后继续阅读 XML

javascript - TypeError : Value undefined (result of expression xmlDoc. 加载)不是对象

java - Mule ESB 3.3 Mulecontext 注册表弹出

java - Android Studio 2.1.3 中构建错误