SpringBoot + tk.mybatis,多数据源配置,启动失败!!!

NO_7 2018-11-22 01:41:47
之前用的SpringFramework配置的多数据源,Spring + mybatis + tk.mybatis,配置如下

<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>4.1.8.RELEASE</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.2.8</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>1.2.3</version>
</dependency>
<dependency>
<groupId>tk.mybatis</groupId>
<artifactId>mapper</artifactId>
<version>3.3.4</version>
</dependency>


<!-- ===========================================source edu db start============================================= -->
<!-- 配置数据源使用的是Druid数据源 -->
<bean name="dataSource_edu" class="com.alibaba.druid.pool.DruidDataSource" init-method="init"
destroy-method="close">
<property name="url" value="${edu.jdbc.url}" />
<property name="username" value="${edu.jdbc.username}" />
<property name="password" value="${edu.jdbc.password}" />
<!-- 初始化连接大小 -->
<property name="initialSize" value="0" />
<!-- 连接池最大使用连接数量 -->
<property name="maxActive" value="20" />
<!-- 连接池最小空闲 -->
<property name="minIdle" value="0" />
<!-- 获取连接最大等待时间 -->
<property name="maxWait" value="60000" />
<property name="poolPreparedStatements" value="true" />
<property name="maxPoolPreparedStatementPerConnectionSize" value="33" />
<!-- 用来检测有效SQL -->
<property name="validationQuery" value="SELECT 1 FROM DUAL" />
<property name="testOnBorrow" value="false" />
<property name="testOnReturn" value="false" />
<property name="testWhileIdle" value="true" />
<!-- 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 -->
<property name="timeBetweenEvictionRunsMillis" value="60000" />
<!-- 配置一个连接在池中最小生存的时间,单位是毫秒 -->
<property name="minEvictableIdleTimeMillis" value="25200000" />
<!-- 打开removeAbandoned功能 -->
<property name="removeAbandoned" value="true" />
<!-- 1800秒,也就是30分钟 -->
<property name="removeAbandonedTimeout" value="1800" />
<!-- 关闭abanded连接时输出错误日志 -->
<property name="logAbandoned" value="true" />
<!-- 监控数据库 -->
<property name="filters" value="stat,wall" />
</bean>
<!-- Mybatis Mapper文件 -->
<bean id="sqlSessionFactory_edu" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource_edu" />
<property name="mapperLocations">
<array>
<value>classpath*:com/ssic/cloud/***/source/dao/edu/mapper/*Mapper.xml</value>
</array>
</property>
<property name="typeAliasesPackage" value="com.sm.**.model;com.ssic.**.mapper;com.ssic.**.entities;" />
<property name="plugins">
<array>
<bean class="com.github.pagehelper.PageHelper">
<property name="properties">
<value>
dialect=${jdbc.dialect}
reasonable=true
</value>
</property>
</bean>
</array>
</property>
</bean>
<!-- 配置事务管理器 -->
<bean id="transactionManager_edu" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource_edu" />
</bean>
<!-- 注解方式配置事物 -->
<tx:annotation-driven transaction-manager="transactionManager_edu" />
<!-- 管理指定的mapper文件 -->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="com.ssic.cloud.dbtools.data.source.dao.edu.mapper" />
<property name="sqlSessionFactoryBeanName" value="sqlSessionFactory_edu"/>
</bean>
<!-- ===========================================source edu db end============================================== -->

改造成SpringBoot方式,相关配置如下:

<dependency>
<groupId>tk.mybatis</groupId>
<artifactId>mapper-spring-boot-starter</artifactId>
<version>1.2.3</version>
</dependency>



#etl b2b order db
etl.b2b.order.jdbc.driver-class-name=com.mysql.jdbc.Driver
etl.b2b.order.jdbc.dialect=mysql
etl.b2b.order.jdbc.jdbc-url=jdbc:mysql://x.x.x.x:3306/ssic_order?useUnicode=true&characterEncoding=utf-8
etl.b2b.order.jdbc.username=dba
etl.b2b.order.jdbc.password=ccc

#etl b2b goods db
etl.b2b.goods.jdbc.driver-class-name=com.mysql.jdbc.Driver
etl.b2b.goods.jdbc.dialect=mysql
etl.b2b.goods.jdbc.url=jdbc:mysql://x.x.x.x:3306/ssic_goods?useUnicode=true&characterEncoding=utf-8
etl.b2b.goods.jdbc.username=dba
etl.b2b.goods.jdbc.password=ccc


SpringBoot启动入口

@EnableAutoConfiguration
@SpringBootApplication
@PropertySource("classpath:config/application.properties")
//@ComponentScan("com.ssic.cloud.etl")
public class Program {
public static void main(String[] args) {

SpringApplication.run(Program.class, args);
}
}

自定义的数据源配置类如下,

import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.SqlSessionTemplate;
//import org.mybatis.spring.annotation.MapperScan;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.jdbc.DataSourceBuilder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;

import tk.mybatis.spring.annotation.MapperScan;

/*goods数据库*/
@Configuration
@MapperScan(basePackages = "com.ssic.cloud.etl.business.B2BB1.dao.goods.mapper", sqlSessionTemplateRef = "goodsSqlSessionTemplate")
public class DataSourceGoodsConfig {
@Bean(name = "goodsDataSource")
@ConfigurationProperties(prefix = "etl.b2b.goods.jdbc")
//@Primary
public DataSource testDataSource() throws Exception {

return DataSourceBuilder.create().type(com.alibaba.druid.pool.DruidDataSource.class).build();
}

@Bean(name = "goodsSqlSessionFactory")
//@Primary /*此处必须在主数据库的数据源配置上加上@Primary*/
public SqlSessionFactory testSqlSessionFactory(@Qualifier("goodsDataSource") DataSource dataSource) throws Exception {
SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
bean.setDataSource(dataSource);
/*加载mybatis全局配置文件*/
//bean.setConfigLocation(new PathMatchingResourcePatternResolver().getResource("classpath:mybatis/mybatis-config.xml"));
/*加载所有的mapper.xml映射文件*/
bean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath:**/dao/goods/mapper/*.xml"));
return bean.getObject();
}

@Bean(name = "goodsTransactionManager")
//@Primary
public DataSourceTransactionManager testTransactionManager(@Qualifier("goodsDataSource") DataSource dataSource) {
return new DataSourceTransactionManager(dataSource);
}

@Bean(name = "goodsSqlSessionTemplate")
//@Primary
public SqlSessionTemplate testSqlSessionTemplate(@Qualifier("goodsSqlSessionFactory") SqlSessionFactory sqlSessionFactory) throws Exception {
return new SqlSessionTemplate(sqlSessionFactory);
}
}

其中MapperScan之前用的org的,启动成功,页面访问,调用mapper后台报错:

Thu Nov 22 13:35:04 CST 2018 WARN: Establishing SSL connection without server's identity verification is not recommended. According to MySQL 5.5.45+, 5.6.26+ and 5.7.6+ requirements SSL connection must be established by default if explicit option isn't set. For compliance with existing applications not using SSL the verifyServerCertificate property is set to 'false'. You need either to explicitly disable SSL by setting useSSL=false, or set useSSL=true and provide truststore for server certificate verification.
13:35:05.150 [http-nio-8080-exec-1] ERROR o.a.c.c.C.[.[.[.[dispatcherServlet] - Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.builder.BuilderException: Error invoking SqlProvider method (tk.mybatis.mapper.provider.base.BaseSelectProvider.dynamicSQL). Cause: java.lang.InstantiationException: tk.mybatis.mapper.provider.base.BaseSelectProvider] with root cause
java.lang.NoSuchMethodException: tk.mybatis.mapper.provider.base.BaseSelectProvider.<init>()
at java.lang.Class.getConstructor0(Class.java:3082)
at java.lang.Class.newInstance(Class.java:412)


改为tx的MapperScan,启动失败,报错如下:

13:38:07.744 [restartedMain] ERROR org.springframework.boot.SpringApplication - Application run failed
java.lang.RuntimeException: java.lang.reflect.InvocationTargetException
at tk.mybatis.spring.mapper.SpringBootBindUtil$SpringBoot2Bind.bind(SpringBootBindUtil.java:129) ~[mapper-spring-boot-autoconfigure-1.2.3.jar:?]
at tk.mybatis.spring.mapper.SpringBootBindUtil.bind(SpringBootBindUtil.java:58) ~[mapper-spring-boot-autoconfigure-1.2.3.jar:?]
Caused by: java.lang.reflect.InvocationTargetException
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[?:1.8.0_131]
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[?:1.8.0_131]
Caused by: java.util.NoSuchElementException: No value bound
at org.springframework.boot.context.properties.bind.BindResult.get(BindResult.java:56) ~[spring-boot-2.0.4.RELEASE.jar:2.0.4.RELEASE]
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[?:1.8.0_131]

网上看了很多,怀疑是SpringBoot加载tk.mybatis出错,但异常信息太少,求助大牛
...全文
500 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复
## 项目介绍 提供快速的搭建spring,spring boot项目,提供spring boot阔展等,希望通过大家一起学习人人都可以堆各种组件当架构尸吓尿面试官,迎娶白富美(HRBP),该项目中大多数总结来自于抄袭一些优秀开源项目,比如pom依赖管理就是抄袭的 spring boot的项目管理方式。 ## 功能介绍 集成tk-mybatis,并扩展了BaseService(改名为BaseRepository) 和 LogicService(带逻辑删除-该接口已删除-依然可以继承AbstractLogicRepositoryImpl完成逻辑资源操作),提供日志记录,线程内MDC日志Id,统一的restful返回标准,基于tk-mybatis的逆向代码生成工具,提供基于redisson的注解式分布式锁DLock,提供自己扩展的 spring boot starter,提供springcloud统一数据解析和异常传递。 ## 模块介绍 ### easy-dependencies 该模块管理所有的jar包集成,整合spring boot和spring cloud等。 ## 项目备注 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.md文件(如有),仅供学习参考, 切勿用于商业用途。

67,512

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧