解决java.lang.IllegalArgumentException:Property ‘sqlSessionFactory‘ or ‘sqlSessionTemplate‘ are requir

导读:本篇文章讲解 解决java.lang.IllegalArgumentException:Property ‘sqlSessionFactory‘ or ‘sqlSessionTemplate‘ are requir,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com

1. 复现问题

今天在测试如下代码时:

@SpringBootTest
class LowCodeApplicationTests {

  @Autowired private Userservice userservice;

  @Test
  void contextLoads() {
    List<User> users = userservice.queryByParam("测试");
    for (User user : users) {
      System.out.println(user);
    }
  }
}

报错如下错误:

Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'userMapper' defined in file [D:\project\target\classes\com\cloud\lowcode\mapper\UserMapper.class]: Invocation of init method failed; nested exception is java.lang.IllegalArgumentException: Property 'sqlSessionFactory' or 'sqlSessionTemplate' are required
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1786)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:602)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:524)
	at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:335)
	at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234)
	at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:333)
	at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:213)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.resolveBeanByName(AbstractAutowireCapableBeanFactory.java:461)
	at org.springframework.context.annotation.CommonAnnotationBeanPostProcessor.autowireResource(CommonAnnotationBeanPostProcessor.java:527)
	at org.springframework.context.annotation.CommonAnnotationBeanPostProcessor.getResource(CommonAnnotationBeanPostProcessor.java:497)
	at org.springframework.context.annotation.CommonAnnotationBeanPostProcessor$ResourceElement.getResourceToInject(CommonAnnotationBeanPostProcessor.java:650)
	at org.springframework.beans.factory.annotation.InjectionMetadata$InjectedElement.inject(InjectionMetadata.java:228)
	at org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:119)
	at org.springframework.context.annotation.CommonAnnotationBeanPostProcessor.postProcessProperties(CommonAnnotationBeanPostProcessor.java:318)
	... 83 more
Caused by: java.lang.IllegalArgumentException: Property 'sqlSessionFactory' or 'sqlSessionTemplate' are required
	at org.springframework.util.Assert.notNull(Assert.java:201)
	at org.mybatis.spring.support.SqlSessionDaoSupport.checkDaoConfig(SqlSessionDaoSupport.java:122)
	at org.mybatis.spring.mapper.MapperFactoryBean.checkDaoConfig(MapperFactoryBean.java:73)
	at org.springframework.dao.support.DaoSupport.afterPropertiesSet(DaoSupport.java:44)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1845)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1782)
	... 96 more

即错误信息为:java.lang.IllegalArgumentException: Property 'sqlSessionFactory' or 'sqlSessionTemplate' are required

2. 分析问题

将该错误信息翻译成中文为java.lang.IllegalArgumentException:属性“sqlSessionFactory”或“sqlSessionTemplate”是必需的

2.1 检查是否引入了mybatis的jar包

<properties>
    <java.version>1.8</java.version>
    <mybatisStarter.version>2.2.2</mybatisStarter.version>
    <baomidouStarter.version>1.0.5</baomidouStarter.version>
    <baomidouMybatisPlus.version>2.1.9</baomidouMybatisPlus.version>
</properties>

<dependency>
    <groupId>org.mybatis.spring.boot</groupId>
    <artifactId>mybatis-spring-boot-starter</artifactId>
    <version>${mybatisStarter.version}</version>
</dependency>
<dependency>
    <groupId>com.baomidou</groupId>
    <artifactId>mybatisplus-spring-boot-starter</artifactId>
    <version>${baomidouStarter.version}</version>
</dependency>
<dependency>
    <groupId>com.baomidou</groupId>
    <artifactId>mybatis-plus</artifactId>
    <version>${baomidouMybatisPlus.version}</version>
</dependency>

2.2 检查启动类的配置

检查启动类是否加上MapperScan,如下已加上该注解:

@SpringBootApplication(exclude= {DataSourceAutoConfiguration.class})
@MapperScan("com.**.mapper")
public class LowCodeApplication {

    public static void main(String[] args) {
        SpringApplication.run(LowCodeApplication.class, args);
    }

}

2.3 检查xml文件对应java类的配置是否有误

如下是userMapper.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="com.cloud.lowcode.mapper.UserMapper">
    <select id="queryByParam" parameterType="string" resultType="com.cloud.lowcode.entity.po.User">
        SELECT * FROM `user`
        <where>
            <if test="username != null || username.length > 0">
                name = #{username}
            </if>
        </where>
    </select>
</mapper>

再看对应的UserMapper.java类,如下所示:

package com.cloud.lowcode.mapper;

import com.baomidou.mybatisplus.mapper.BaseMapper;
import com.cloud.lowcode.entity.po.User;
import org.apache.ibatis.annotations.Mapper;

import java.util.List;

/**
 * @author 念兮为美
 * @datetime 2022/11/28 13:51
 * @desc 用户实体类
 */
@Mapper
public interface UserMapper extends BaseMapper<User> {
  List<User> queryByParam(String username);
}

userMapper.xmluserMapper.java对应如下:

  • userMapper.xmlUserMapper.java的名字一样(不包括后缀名)

  • userMapper.xml中的namespacecom.cloud.lowcode.mapper.UserMapper对应UserMapper.java中的包名+类名,没问题

  • userMapper.xml中的idqueryByParam对应UserMapper.java中的方法名,没问题

  • userMapper.xml中的参数类型parameterTypestring对应UserMapper.java中的queryByParam字符串类型,没问题

  • 经检查resultType也没问题

2.4 检查application.yml文件的mybatis配置是否有误

如下是application.yml配置的mybatis信息:

#mybatis配置
mybatis-plus:
  configuration:
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
  mapper-locations: classpath*:/mapper/*Mapper.xml
  type-aliases-package: com.cloud.lowcode.entity.po

该配置信息没有问题。

2.5 检查pon.xml文件

<build>
	<resources>
        <resource>
                <directory>src/main/resources</directory>
                <includes>
                    <include>**/*.yml</include>
                    <include>**/*.xml</include>
                </includes>
                <filtering>true</filtering>
            </resource>
            <resource>
                <directory>src/main/java</directory>
                <filtering>true</filtering>
            </resource>
    </resources>
</build>

pom.xml中已配置了resource信息,也没有问题。

以上四种情况,都没有问题,那么,问题出现在哪里呢?

3. 解决问题

尝试删除启动类中的exclude={DataSourceAutoConfiguration.class},即修改成如下代码:

@SpringBootApplication
@MapperScan("com.**.mapper")
public class LowCodeApplication {

    public static void main(String[] args) {
        SpringApplication.run(LowCodeApplication.class, args);
    }

}

重新启动测试类,便能成功运行,如下代码所示:

在这里插入图片描述

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之家整理,本文链接:https://www.bmabk.com/index.php/post/99114.html

(0)
小半的头像小半

相关推荐

极客之家——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!