今天整合springMVC+Mybatis时tomcat启动初始化报错一直解决不了,哪位大哥能帮帮我啊万分感谢

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了今天整合springMVC+Mybatis时tomcat启动初始化报错一直解决不了,哪位大哥能帮帮我啊万分感谢相关的知识,希望对你有一定的参考价值。

错误如下:
严重: Exception sending context initialized event to listener instance of class org.springframework.web.context.ContextLoaderListener
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'userService': Injection of resource dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'userMapper' defined in file [D:\study_tool\apache-tomcat-7.0.37\an\webapps\springMVC_mybatis_test\WEB-INF\classes\com\fang\dao\UserMapper.class]: Cannot resolve reference to bean 'sqlSessionFactory' while setting bean property 'sqlSessionFactory'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'sqlSessionFactory' defined in class path resource [spring-mybatis.xml]: Invocation of init method failed; nested exception is java.lang.NoSuchMethodError: org.apache.ibatis.session.Configuration.setDatabaseId(Ljava/lang/String;)V
at org.springframework.context.annotation.CommonAnnotationBeanPostProcessor.postProcessPropertyValues(CommonAnnotationBeanPostProcessor.java:301)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1074)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:517)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:456)
at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:293)
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:222)
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:290)
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:192)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:585)
at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:895)
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:425)

参考技术A spring-mybatis.xml
: Invocation of init method failed; nested exception is java.lang.NoSuchMethodError: org.apache.ibatis.session.Configuration.setDatabaseId(Ljava/lang/String;)V

org.apache.ibatis.session.Configuration.setDatabaseId 找不到这个方法,你jar包换个版本试试吧追问

已经换过啦是最新的版本。可是还是报这个错误啊。不知道是注解的原因还是spring-mybatis.xml的原因。还是没找出来啊 求助啊 大哥

追答

开发中不是最新版的就是最好的。

试试换到低版本吧,你会反编译么?

如果会的反编译一下,看看里面有没有这个方法就知道jar包版本对不对了

如何纯注解整合Spring SpringMVC Mybatis

文章目录

前言

心血来潮想要玩玩最原始的SSM,结果发现还有好多人的都是基于配置文件的一个创建方式,那么今天的话就带来基于配置类,基于注解来配置的一个方案吧,这样的SSM开发也可以变得和SpringBoot一样短平快。顺便冒个泡泡,后面有空咱们还得聊聊SpringBoot这个崽做了什么,如何做一个start。那么废话不多说发车了,let’s go!

项目创建

咱们这里就直接创建一个最简单的webapp的maven项目。

之后打开项目,创建一下模块

依赖导入

咱们这边的话还是说玩纯注解开发,然后也是摒弃jsp,我们这边选择这个vue来代替jsp,众所周之,vue 是有两个创建方式的。那么我们这边是倾向于vue+restful风格的,那么接下来的话也是打算记录一些SSM到SpringCloud到k8s的随笔系列。
我们导入如下依赖,同时删除使用webapp模板创建的一些插件啥的,保持maven pom文件的清爽。

  <dependencies>

    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-webmvc</artifactId>
      <version>5.3.22</version>
    </dependency>

    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-jdbc</artifactId>
      <version>5.3.22</version>
    </dependency>

    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-test</artifactId>
      <version>5.3.22</version>
    </dependency>

    <dependency>
      <groupId>org.mybatis</groupId>
      <artifactId>mybatis</artifactId>
      <version>3.5.10</version>
    </dependency>

    <dependency>
      <groupId>mysql</groupId>
      <artifactId>mysql-connector-java</artifactId>
      <version>8.0.30</version>
    </dependency>

    <dependency>
      <groupId>com.alibaba</groupId>
      <artifactId>druid</artifactId>
      <version>1.2.11</version>
    </dependency>

    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.13.2</version>
      <scope>test</scope>
    </dependency>

    <dependency>
      <groupId>javax.servlet</groupId>
      <artifactId>javax.servlet-api</artifactId>
      <version>4.0.1</version>
    </dependency>

    <dependency>
      <groupId>com.fasterxml.jackson.core</groupId>
      <artifactId>jackson-databind</artifactId>
      <version>2.13.4</version>
    </dependency>
    <dependency>
      <groupId>org.mybatis</groupId>
      <artifactId>mybatis-spring</artifactId>
      <version>2.0.7</version>
    </dependency>

  </dependencies>


这里没有导入spring-context 因为在spring-mvc是有的。

那么咱们这个依赖里面主要第一个mybatis和spring整合的一些依赖以及咱们的Jackson,后面咱们用json玩,所以需要这个。

tomcat 插件

这里主要说一下的是tomcat8是没有的,但是如果我们要导入的话需要这样做:


  <build>
    <plugins>
      <plugin>
        <groupId>org.apache.tomcat.maven</groupId>
        <artifactId>tomcat8-maven-plugin</artifactId>
        <version>3.0-r1655215</version>
        <configuration>
          <port>8080</port>
          <path>/</path>
          <uriEncoding>UTF-8</uriEncoding>
        </configuration>
      </plugin>
    </plugins>
  </build>

  <!--配置Tomcat8仓库-->
  <pluginRepositories>
    <pluginRepository>
      <id>alfresco-public</id>
      <url>https://artifacts.alfresco.com/nexus/content/groups/public</url>
    </pluginRepository>
    <pluginRepository>
      <id>alfresco-public-snapshots</id>
      <url>https://artifacts.alfresco.com/nexus/content/groups/public-snapshots</url>
      <snapshots>
        <enabled>true</enabled>
        <updatePolicy>daily</updatePolicy>
      </snapshots>
    </pluginRepository>
    <!--这个google的用不了-->
    <!--<pluginRepository>
        <id>beardedgeeks-releases</id>
        <url>http://beardedgeeks.googlecode.com/svn/repository/releases</url>
    </pluginRepository>-->
  </pluginRepositories>


但是这里有点问题,在我的实际环境里面,如果有问题的话还是使用7的吧,高版本的可能都会有点问题。

tomcat 7 插件

那么如果有问题的话,那么咱们就直接用7的。

<build>
	<plugins>

		<plugin>
			<groupId>org.apache.tomcat.maven</groupId>
			<artifactId>tomcat7-maven-plugin</artifactId>
			<version>2.2</version>

			<configuration>				
				<path>/</path> <!--项目访问路径。当前配置的访问是localhost:9090/, 如果配置是/aa,则访问路径为localhost:9090/aa -->
				<port>9090</port>
				<uriEncoding>UTF-8</uriEncoding><!-- 非必需项 -->
			</configuration>
		</plugin>

	</plugins>
</build>

然后在这里配置一下:

就可以跑了。

使用本地tomcat8

我这里的话还是喜欢tomcat8的,然后用本地的。

在idea里面比较智能的是,这玩意你第一次打开会提示Fix,你点击一下就不要自己搞了。之后运行成功。

创建配置类

我们不用XML的原因是spring对注解的支持嘛,我们用配置类来代替application.xml。
我们创建如下配置:

这里咱们没有数据层,因为数据库里面没东西,那个mapper的话可以不要了,反正咱们是纯注解开发。

SpringConfig

@Configuration
@ComponentScan("com.huterox.service")
@PropertySource("classpath:jdbc.properties")
@Import(DuridConfig.class,MybatisConfig.class)
public class SpringConfig 



DuridConfig

这个其实jdbc的一个配置。

咱们这里面提出了一个配置文件,


import javax.sql.DataSource;

public class DuridConfig 
    @Value("$jdbc.driver")
    private String driver;
    @Value("$jdbc.url")
    private String url;
    @Value("$jdbc.username")
    private String username;
    @Value("$jdbc.password")
    private String password;

    @Bean
    public DataSource dataSource()
        DruidDataSource dataSource = new DruidDataSource();
        dataSource.setDriverClassName(driver);
        dataSource.setUrl(url);
        dataSource.setUsername(username);
        dataSource.setPassword(password);
        return dataSource;
    


mybatis配置

这个主要是sqlsessionfactory 和 mapper地址,其实就是你的dao层。


public class MybatisConfig 

    @Bean
    public SqlSessionFactoryBean sqlSessionFactory(DataSource dataSource)
        SqlSessionFactoryBean factoryBean = new SqlSessionFactoryBean();
        factoryBean.setDataSource(dataSource);
        factoryBean.setTypeAliasesPackage("com.huterox.dao");
        return factoryBean;
    

    public MapperScannerConfigurer mapperScannerConfigurer()
        MapperScannerConfigurer scannerConfigurer = new MapperScannerConfigurer();
        scannerConfigurer.setBasePackage("com.huterox.dao");
        return scannerConfigurer;
    



MVC配置

@Configuration
@ComponentScan("com.huterox.controller")
@EnableWebMvc
public class SpringMvcConfig 


这里的话,单独把mvc的配置搞出来了,其实没有必要一起放在Spring里面也是可以的。但是咱们这边规范一点。

Servlet配置

MVC其实还是用这个Servlet的是吧,用tomcat是吧,做了一个dispatch,一般呢,咱们是在web.xml里面去配置,例如路径啊,启动类啊,一般是启动到咱们的mvc的一个容器。那么咱们这边也是做整合,要这个Spring去整合到mybatis,mvc的实现也是用到了springIOC的,所以在里面也mvc里面有spring-context.

那么为了能够让咱们的这个正常启动,我们使用配置,然后tomcat启动的时候会发现这个配置,因为我们接下来要继承一个类,然后重写方法,所以启动的时候呢,会把咱们的SpringMVC,和 Spring容器都启动,然后完成工作。

import org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer;

public class ServletConfig extends AbstractAnnotationConfigDispatcherServletInitializer 

    protected Class<?>[] getRootConfigClasses() 
//        子容器
        return new Class[]SpringConfig.class;
    

    protected Class<?>[] getServletConfigClasses() 
//        父容器,MVC可以访问Spring容器,可以不单独提取出来SpringConfig
//        统一配置,然后填这里就完了。
        return new Class[]SpringMvcConfig.class;
    

    protected String[] getServletMappings() 
        return new String[]"/";
    


测试

由于咱们这里面没有dao,所以这方面没法演示,也没有办法演示事务。

所以这里就测试web吧,之后咱们用这套直接纯注解开发,已经2202年了是吧。

总结

这个没啥好说的,又水了一篇博客~

以上是关于今天整合springMVC+Mybatis时tomcat启动初始化报错一直解决不了,哪位大哥能帮帮我啊万分感谢的主要内容,如果未能解决你的问题,请参考以下文章

SpringMVC学习04SpringMyBatis和SpringMVC的整合

如何纯注解整合Spring SpringMVC Mybatis

SpringMVC + MyBatis整合

SpringMVC-Mybatis整合和注解开发

SpringMVC学习--springmvc和mybatis整合

springmvc学习笔记-springmvc整合mybatis之service