解决:java.lang.IllegalStateException: Property 'configuration' and 'configLocation' can not specified

本文详细解析了在SpringBoot项目中使用MyBatis时,application.yml配置文件中出现的配置冲突问题。指出在同一文件中同时设置mybatis的config-location和configuration属性会导致错误,并提供了两种正确的配置方式,帮助开发者避免此类问题。

本例环境: springboot + IntelliJ IDEA 
报错信息:
解决:
   在springboot的application.yml不能同时使用以下两个配置,换句话说,两者配置方式只能取其一.
   mybatis:
        config-location: classpath:mybatis/mybatis-config.xml
        configuration:
            map-underscore-to-camel-case: true
   正确方式一:
   mybatis:
        # 指定全局配置文件位置
        config-location: classpath:mybatis/mybatis-config.xml
        # 指定sql映射文件位置
       mapper-locations: classpath:mybatis/mapper/*.xml
   正确方式二:
   # 指定sql映射文件位置
   mybatis:
       mapper-locations: classpath:mybatis/mapper/*.xml
       configuration:
           map-underscore-to-camel-case: true
以上,TKS.

这个错误 **`java.lang.IllegalStateException: Property 'configuration' and 'configLocation' can not specified with together`** 是 MyBatis 或 MyBatis-Plus 的配置冲突问题,原因是 **同时指定了 `configuration` 和 `configLocation` 属性**,而 MyBatis 不允许两者共存。以下是详细分析和解决方案: --- ### **错误原因** 1. **配置冲突** - `configuration` 是直接通过 Java 代码配置 MyBatis 的全局设置(如 `mapUnderscoreToCamelCase`)。 - `configLocation` 是通过外部 XML 文件(如 `mybatis-config.xml`)配置 MyBatis。 **两者只能二选一**,同时设置会触发此异常。 2. **常见场景** 在 Spring Boot 或 Spring 配置中,可能同时定义了以下属性: ```java factoryBean.setConfiguration(mybatisConfiguration); // 代码配置 factoryBean.setConfigLocation(resolver.getResource("classpath:mybatis-config.xml")); // XML配置 ``` --- ### **解决方案** #### **方案 1:二选一(推荐)** 根据项目需求,选择 **代码配置** 或 **XML 配置**,避免同时使用。 ##### **选项 1:使用 `configuration`(代码配置)** ```java @Bean public SqlSessionFactory dynamicSqlSessionFactory(DataSource dynamicDS) throws Exception { MybatisSqlSessionFactoryBean factoryBean = new MybatisSqlSessionFactoryBean(); factoryBean.setDataSource(dynamicDS); factoryBean.setMapperLocations(resolver.getResources("classpath:" + MAPPER_PATH)); // 直接通过代码配置 MyBatis org.apache.ibatis.session.Configuration configuration = new org.apache.ibatis.session.Configuration(); configuration.setMapUnderscoreToCamelCase(true); // 开启驼峰命名 configuration.setCacheEnabled(false); // 禁用二级缓存(示例) factoryBean.setConfiguration(configuration); // 仅设置 configuration return factoryBean.getObject(); } ``` ##### **选项 2:使用 `configLocation`(XML 配置)** ```java @Bean public SqlSessionFactory dynamicSqlSessionFactory(DataSource dynamicDS) throws Exception { MybatisSqlSessionFactoryBean factoryBean = new MybatisSqlSessionFactoryBean(); factoryBean.setDataSource(dynamicDS); factoryBean.setMapperLocations(resolver.getResources("classpath:" + MAPPER_PATH)); // 通过 XML 文件配置 MyBatis factoryBean.setConfigLocation(resolver.getResource("classpath:config/mybatis-config.xml")); // 仅设置 configLocation return factoryBean.getObject(); } ``` 对应的 `mybatis-config.xml` 示例: ```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="mapUnderscoreToCamelCase" value="true"/> <setting name="cacheEnabled" value="false"/> </settings> </configuration> ``` --- #### **方案 2:合并配置(高级)** 如果需要混合使用代码和 XML 配置,可以通过以下方式: 1. **在 XML 中定义基础配置**,然后通过代码覆盖部分设置: ```java @Bean public SqlSessionFactory dynamicSqlSessionFactory(DataSource dynamicDS) throws Exception { MybatisSqlSessionFactoryBean factoryBean = new MybatisSqlSessionFactoryBean(); factoryBean.setDataSource(dynamicDS); factoryBean.setMapperLocations(resolver.getResources("classpath:" + MAPPER_PATH)); // 1. 先加载 XML 配置 factoryBean.setConfigLocation(resolver.getResource("classpath:config/mybatis-config.xml")); // 2. 获取 Configuration 对象并修改 SqlSessionFactory factory = factoryBean.getObject(); org.apache.ibatis.session.Configuration configuration = factory.getConfiguration(); configuration.setMapUnderscoreToCamelCase(true); // 覆盖 XML 中的设置 return factory; } ``` **注意**:此方法可能因 MyBatis 版本不同而存在差异,需测试验证。 --- ### **验证配置是否生效** 1. **检查日志** 在日志中搜索 `MyBatis configuration` 相关输出,确认最终生效的配置。 2. **测试功能** 例如,如果配置了 `mapUnderscoreToCamelCase`,测试数据库字段 `user_name` 是否能自动映射到实体类的 `userName` 属性。 --- ### **常见问题** #### 1. **为什么不能同时使用 `configuration` 和 `configLocation`?** - MyBatis 设计上要求全局配置来源唯一,避免优先级冲突。 - 两者同时存在时,无法确定是代码配置还是 XML 配置优先。 #### 2. **Spring Boot 中的配置方式** 在 `application.yml` 中,通过 `mybatis.configuration` 或 `mybatis.config-location` 二选一: ```yaml # 方案1:代码配置(通过 mybatis.configuration.*) mybatis: configuration: map-underscore-to-camel-case: true # 方案2:XML配置 mybatis: config-location: classpath:config/mybatis-config.xml ``` #### 3. **如何调试 MyBatis 配置?** 在日志中开启 DEBUG 级别: ```yaml logging: level: org.mybatis: DEBUG ``` --- ### **总结** - **根本问题**:`configuration` 和 `configLocation` 冲突。 - **解决方案**: 1. 选择 **代码配置** 或 **XML 配置**,避免同时使用。 2. 如需混合配置,先加载 XML,再通过代码覆盖(需测试验证)。 - **推荐做法**:在 Spring Boot 中优先使用 `application.yml` 的 `mybatis.configuration.*` 配置。 如果问题仍未解决,请提供: 1. 完整的 `MybatisSqlSessionFactoryBean` 配置代码。 2. `mybatis-config.xml` 文件内容(如有)。 3. 使用的 MyBatis 和 Spring Boot 版本。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值