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出错,但异常信息太少,求助大牛
...全文
596 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复
资源下载链接为: https://pan.quark.cn/s/22ca96b7bd39 Spring Boot 是由 Pivotal 团队开发的一个开源框架,旨在简化基于 Spring 的应用开发。它通过自动配置、内嵌服务器和起步依赖等功能,帮助开发者快速构建独立运行的 Java 应用。在探讨“Spring Boot + tk.MyBatis 整合 + YAML 配置 + Logback 配置”这一主题时,我们将重点关注以下关键知识点: Spring Boot 整合 tk.MyBatis tk.MyBatisMyBatis 的一个扩展,提供了动态 SQL、通用 Mapper 和通用 Service 等实用功能。整合 tk.MyBatis 到 Spring Boot 项目中,需要以下步骤: 引入 tk.MyBatisMyBatis 的依赖。 配置 MyBatis 的核心配置文件,涵盖数据源、SqlSessionFactory 和 Mapper 扫描等内容。 创建 Mapper 接口及对应的 XML 文件,利用 tk.MyBatis 的注解简化 SQL 编写。 在 Spring Boot 主配置类中启用 tk.MyBatis 插件。 YAML 配置 YAML 是一种易于阅读的数据序列化格式,Spring Boot 默认支持 YAML 和 Properties 配置文件。相比 Properties,YAML 的层次结构更清晰。application.yml 文件用于定义配置属性,如服务器端口、数据库连接信息和日志配置等。开发者可以通过 @Value 注解或 @ConfigurationProperties 注入这些配置。 Logback 配置 Logback 是一个比 Log4j 更快、更灵活的日志框架。在 Spring Boot 项目中,可以通过自定义 logba

67,542

社区成员

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

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