返回顶部
首页 > 资讯 > 精选 >MybatisPlus整合Flowable出现错误怎么解决
  • 532
分享到

MybatisPlus整合Flowable出现错误怎么解决

2023-07-05 19:07:58 532人浏览 独家记忆
摘要

这篇文章主要介绍了mybatisPlus整合Flowable出现错误怎么解决的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇MybatisPlus整合Flowable出现错误怎么解决文章都会有所收获,下面我们一起

这篇文章主要介绍了mybatisPlus整合Flowable出现错误怎么解决的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇MybatisPlus整合Flowable出现错误怎么解决文章都会有所收获,下面我们一起来看看吧。

问题

Description:

file [D:\project\carshow-server\server-flowable\flowable-admin\target\classes\com\carshow\flowable\mapper\IFlowableCommentMapper.class] required a single bean, but 2 were found:
    - sqlSessionFactory: defined by method 'sqlSessionFactory' in class path resource [com/baomidou/mybatisplus/autoconfigure/MybatisPlusAutoConfiguration.class]
    - modelerSqlSessionFactory: defined by method 'modelerSqlSessionFactory' in class path resource [org/flowable/ui/modeler/conf/ModelerDatabaseConfiguration.class]


Action:

Consider marking one of the beans as @Primary, updating the consumer to accept multiple beans, or using @Qualifier to identify the bean that should be consumed

原因

整合的bean冲突,spring找到了两个

查看两个类源码找到对应的bean

MybatisPlus: MybatisPlusAutoConfiguration.class

MybatisPlus整合Flowable出现错误怎么解决

Flowable:ModelerDatabaseConfiguration.class

MybatisPlus整合Flowable出现错误怎么解决

注解解释

@ConditionalOnMissingBean:它是修饰bean的一个注解,主要实现的是,当你的bean被注册之后,如果有注册相同类型的bean,就不会成功,它会保证你的bean只有一个,即你的实例只有一个,当你注册多个相同的bean时,会出现异常,以此来告诉开发人员。

1. 环境:Flowable6.6

2. 解决:

  • 重写mybatis-plus 自动配置类(由于 flowable-modeler 引入时候,会初始化 mybatis的Template和SqlFactory,这导致 mybatis-plus 本身的autoconfig 无法生效,所以需要重写),从源码中拆写代码:

import com.baomidou.mybatisplus.autoconfigure.MybatisPlusProperties;import com.baomidou.mybatisplus.autoconfigure.SpringBootVFS;import com.baomidou.mybatisplus.core.MybatisConfiguration;import com.baomidou.mybatisplus.core.config.GlobalConfig;import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;import com.baomidou.mybatisplus.core.incrementer.IKeyGenerator;import com.baomidou.mybatisplus.core.injector.ISqlInjector;import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;import com.baomidou.mybatisplus.extension.spring.MybatisSqlSessionFactoryBean;import org.apache.ibatis.mapping.DatabaseIdProvider;import org.apache.ibatis.plugin.Interceptor;import org.apache.ibatis.session.ExecutorType;import org.apache.ibatis.session.SqlSessionFactory;import org.mybatis.spring.SqlSessionTemplate;import org.springframework.context.ApplicationContext;import org.springframework.core.io.ResourceLoader;import org.springframework.util.StringUtils;import javax.sql.DataSource;import java.util.List;public class AbstractMybatisPlusConfiguration {    protected SqlSessionFactory getSqlSessionFactory(            DataSource dataSource,            MybatisPlusProperties properties,            ResourceLoader resourceLoader,            Interceptor[] interceptors,            DatabaseIdProvider databaseIdProvider,            ApplicationContext applicationContext    ) throws Exception {        MybatisSqlSessionFactoryBean factory = new MybatisSqlSessionFactoryBean();        factory.setDataSource(dataSource);        factory.setVfs(SpringBootVFS.class);        if (StringUtils.hasText(properties.getConfigLocation())) {            factory.setConfigLocation(resourceLoader.getResource(properties.getConfigLocation()));        }        applyConfiguration(factory, properties);        if (properties.getConfigurationProperties() != null) {            factory.setConfigurationProperties(properties.getConfigurationProperties());        }        if (!ObjectUtils.isEmpty(interceptors)) {            factory.setPlugins(interceptors);        }        if (databaseIdProvider != null) {            factory.setDatabaseIdProvider(databaseIdProvider);        }        if (StringUtils.hasLength(properties.getTypeAliasesPackage())) {            factory.setTypeAliasesPackage(properties.getTypeAliasesPackage());        }        // TODO 自定义枚举包        if (StringUtils.hasLength(properties.getTypeEnumsPackage())) {            factory.setTypeEnumsPackage(properties.getTypeEnumsPackage());        }        if (properties.getTypeAliasesSuperType() != null) {            factory.setTypeAliasesSuperType(properties.getTypeAliasesSuperType());        }        if (StringUtils.hasLength(properties.getTypeHandlersPackage())) {            factory.setTypeHandlersPackage(properties.getTypeHandlersPackage());        }        if (!ObjectUtils.isEmpty(properties.resolveMapperLocations())) {            factory.setMapperLocations(properties.resolveMapperLocations());        }        // TODO 此处必为非 NULL        GlobalConfig globalConfig = properties.getGlobalConfig();        //注入填充器        if (applicationContext.getBeanNamesForType(MetaObjectHandler.class,                false, false).length > 0) {            MetaObjectHandler metaObjectHandler = applicationContext.getBean(MetaObjectHandler.class);            globalConfig.setMetaObjectHandler(metaObjectHandler);        }        //注入主键生成器        if (applicationContext.getBeanNamesForType(IKeyGenerator.class, false,                false).length > 0) {            IKeyGenerator keyGenerator = applicationContext.getBean(IKeyGenerator.class);            globalConfig.getDbConfig().seTKEyGenerators((List<IKeyGenerator>) keyGenerator);        }        //注入sql注入器        if (applicationContext.getBeanNamesForType(ISqlInjector.class, false,                false).length > 0) {            ISqlInjector iSqlInjector = applicationContext.getBean(ISqlInjector.class);            globalConfig.setSqlInjector(iSqlInjector);        }        factory.setGlobalConfig(globalConfig);        return factory.getObject();    }    private void applyConfiguration(MybatisSqlSessionFactoryBean factory, MybatisPlusProperties properties) {        MybatisConfiguration configuration = properties.getConfiguration();        if (configuration == null && !StringUtils.hasText(properties.getConfigLocation())) {            configuration = new MybatisConfiguration();        }//        if (configuration != null && !CollectionUtils.isEmpty(this.configurationCustomizers)) {//            for (ConfigurationCustomizer customizer : this.configurationCustomizers) {//                customizer.customize(configuration);//            }//        }        factory.setConfiguration(configuration);    }    public SqlSessionTemplate getSqlSessionTemplate(SqlSessionFactory sqlSessionFactory, MybatisPlusProperties properties) {        ExecutorType executorType = properties.getExecutorType();        if (executorType != null) {            return new SqlSessionTemplate(sqlSessionFactory, executorType);        } else {            return new SqlSessionTemplate(sqlSessionFactory);        }    }}
  • 继承重写的配置类

import com.baomidou.mybatisplus.autoconfigure.MybatisPlusProperties;import org.apache.ibatis.session.SqlSessionFactory;import org.mybatis.spring.SqlSessionTemplate;import org.mybatis.spring.annotation.MapperScan;import org.springframework.beans.factory.annotation.Qualifier;import org.springframework.boot.context.properties.EnableConfigurationProperties;import org.springframework.context.ApplicationContext;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;import org.springframework.core.io.ResourceLoader;import javax.sql.DataSource;@MapperScan(        sqlSessionTemplateRef = "mySqlSessionTemplate",        sqlSessionFactoryRef = "MysqlSessionFactory")@EnableConfigurationProperties(MybatisPlusProperties.class)@Configurationpublic class MybatisPlusConfiguration extends AbstractMybatisPlusConfiguration {    @Bean(name = "mysqlSessionFactory")    public SqlSessionFactory sqlSessionFactoryBean(DataSource dataSource,                                                   MybatisPlusProperties properties,                                                   ResourceLoader resourceLoader,                                                   ApplicationContext applicationContext) throws Exception {        return getSqlSessionFactory(dataSource,                properties,                resourceLoader,                null,                null,                applicationContext);    }    @Bean(name = "mySqlSessionTemplate")    public SqlSessionTemplate sqlSessionTemplate(MybatisPlusProperties properties,                                                 @Qualifier("mySqlSessionFactory") SqlSessionFactory sqlSessionFactory) {        return getSqlSessionTemplate(sqlSessionFactory, properties);    }}
  • 重写 flowable-modeler 中 ModelerDatabaseConfiguration,用 @Primary 指定框架内部的mybatis 作为默认的

import liquibase.Liquibase;import liquibase.database.Database;import liquibase.database.DatabaseConnection;import liquibase.database.DatabaseFactory;import liquibase.database.JVM.JdbcConnection;import liquibase.exception.DatabaseException;import liquibase.resource.ClassLoaderResourceAccessor;import lombok.extern.slf4j.Slf4j;import org.apache.ibatis.session.SqlSessionFactory;import org.flowable.common.engine.api.FlowableException;import org.flowable.ui.common.service.exception.InternalServerErrorException;import org.flowable.ui.modeler.properties.FlowableModelerAppProperties;import org.mybatis.spring.SqlSessionFactoryBean;import org.mybatis.spring.SqlSessionTemplate;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;import org.springframework.context.annotation.Primary;import org.springframework.core.io.ResourceLoader;import org.springframework.core.io.support.ResourcePatternUtils;import javax.sql.DataSource;import java.sql.Connection;import java.sql.DatabaseMetaData;import java.sql.SQLException;import java.util.Properties;@Configuration@Slf4jpublic class DatabaseConfiguration {    protected static final String LIQUIBASE_CHANGELOG_PREFIX = "ACT_DE_";    @Autowired    protected FlowableModelerAppProperties modelerAppProperties;    @Autowired    protected ResourceLoader resourceLoader;    protected static Properties databaseTypeMappings = getDefaultDatabaseTypeMappings();    public static final String DATABASE_TYPE_H2 = "h3";    public static final String DATABASE_TYPE_HSQL = "hsql";    public static final String DATABASE_TYPE_MYSQL = "mysql";    public static final String DATABASE_TYPE_oracle = "oracle";    public static final String DATABASE_TYPE_POSTGRES = "postgres";    public static final String DATABASE_TYPE_MSSQL = "mssql";    public static final String DATABASE_TYPE_DB2 = "db2";    public static Properties getDefaultDatabaseTypeMappings() {        Properties databaseTypeMappings = new Properties();        databaseTypeMappings.setProperty("H2", DATABASE_TYPE_H2);        databaseTypeMappings.setProperty("HSQL Database Engine", DATABASE_TYPE_HSQL);        databaseTypeMappings.setProperty("MySQL", DATABASE_TYPE_MYSQL);        databaseTypeMappings.setProperty("Oracle", DATABASE_TYPE_ORACLE);        databaseTypeMappings.setProperty("postgresql", DATABASE_TYPE_POSTGRES);        databaseTypeMappings.setProperty("Microsoft SQL Server", DATABASE_TYPE_MSSQL);        databaseTypeMappings.setProperty(DATABASE_TYPE_DB2, DATABASE_TYPE_DB2);        databaseTypeMappings.setProperty("DB2", DATABASE_TYPE_DB2);        databaseTypeMappings.setProperty("DB2/NT", DATABASE_TYPE_DB2);        databaseTypeMappings.setProperty("DB2/NT64", DATABASE_TYPE_DB2);        databaseTypeMappings.setProperty("DB2 UDP", DATABASE_TYPE_DB2);        databaseTypeMappings.setProperty("DB2/linux", DATABASE_TYPE_DB2);        databaseTypeMappings.setProperty("DB2/LINUX390", DATABASE_TYPE_DB2);        databaseTypeMappings.setProperty("DB2/LINUXX8664", DATABASE_TYPE_DB2);        databaseTypeMappings.setProperty("DB2/LINUXZ64", DATABASE_TYPE_DB2);        databaseTypeMappings.setProperty("DB2/LINUXPPC64", DATABASE_TYPE_DB2);        databaseTypeMappings.setProperty("DB2/400 SQL", DATABASE_TYPE_DB2);        databaseTypeMappings.setProperty("DB2/6000", DATABASE_TYPE_DB2);        databaseTypeMappings.setProperty("DB2 UDB iSeries", DATABASE_TYPE_DB2);        databaseTypeMappings.setProperty("DB2/aiX64", DATABASE_TYPE_DB2);        databaseTypeMappings.setProperty("DB2/HPUX", DATABASE_TYPE_DB2);        databaseTypeMappings.setProperty("DB2/HP64", DATABASE_TYPE_DB2);        databaseTypeMappings.setProperty("DB2/SUN", DATABASE_TYPE_DB2);        databaseTypeMappings.setProperty("DB2/SUN64", DATABASE_TYPE_DB2);        databaseTypeMappings.setProperty("DB2/PTX", DATABASE_TYPE_DB2);        databaseTypeMappings.setProperty("DB2/2", DATABASE_TYPE_DB2);        databaseTypeMappings.setProperty("DB2 UDB AS400", DATABASE_TYPE_DB2);        return databaseTypeMappings;    }    @Bean    @Primary    public SqlSessionFactory sqlSessionFactory(DataSource dataSource) {        SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean();        sqlSessionFactoryBean.setDataSource(dataSource);        String databaseType = initDatabaseType(dataSource);        if (databaseType == null) {            throw new FlowableException("couldn't deduct database type");        }        try {            Properties properties = new Properties();            properties.put("prefix", modelerAppProperties.getDataSourcePrefix());            properties.put("blobType", "BLOB");            properties.put("boolValue", "TRUE");            properties.load(this.getClass().getClassLoader().getResourceAsStream("org/flowable/db/properties/" + databaseType + ".properties"));            sqlSessionFactoryBean.setConfigurationProperties(properties);            sqlSessionFactoryBean                    .setMapperLocations(ResourcePatternUtils.getResourcePatternResolver(resourceLoader).getResources("classpath:/META-INF/modeler-mybatis-mappings/*.xml"));            sqlSessionFactoryBean.afterPropertiesSet();            return sqlSessionFactoryBean.getObject();        } catch (Exception e) {            throw new FlowableException("Could not create sqlSessionFactory", e);        }    }    @Primary    @Bean(destroyMethod = "clearCache") // destroyMethod: see https://GitHub.com/mybatis/old-Google-code-issues/issues/778    public SqlSessionTemplate SqlSessionTemplate(SqlSessionFactory sqlSessionFactory) {        return new SqlSessionTemplate(sqlSessionFactory);    }    @Bean    public Liquibase liquibase(DataSource dataSource) {        log.info("Configuring Liquibase");        Liquibase liquibase = null;        try {            DatabaseConnection connection = new JdbcConnection(dataSource.getConnection());            Database database = DatabaseFactory.getInstance().findCorrectDatabaseImplementation(connection);            database.setDatabaseChangeLogTableName(LIQUIBASE_CHANGELOG_PREFIX + database.getDatabaseChangeLogTableName());            database.setDatabaseChangeLogLockTableName(LIQUIBASE_CHANGELOG_PREFIX + database.getDatabaseChangeLogLockTableName());            liquibase = new Liquibase("META-INF/liquibase/flowable-modeler-app-db-changelog.xml", new ClassLoaderResourceAccessor(), database);            liquibase.update("flowable");            return liquibase;        } catch (Exception e) {            throw new InternalServerErrorException("Error creating liquibase database", e);        } finally {            closeDatabase(liquibase);        }    }    protected String initDatabaseType(DataSource dataSource) {        String databaseType = null;        Connection connection = null;        try {            connection = dataSource.getConnection();            DatabaseMetaData databaseMetaData = connection.getMetaData();            String databaseProductName = databaseMetaData.getDatabaseProductName();            log.info("database product name: '{}'", databaseProductName);            databaseType = databaseTypeMappings.getProperty(databaseProductName);            if (databaseType == null) {                throw new FlowableException("couldn't deduct database type from database product name '" + databaseProductName + "'");            }            log.info("using database type: {}", databaseType);        } catch (SQLException e) {            log.error("Exception while initializing Database connection", e);        } finally {            try {                if (connection != null) {                    connection.close();                }            } catch (SQLException e) {                log.error("Exception while closing the Database connection", e);            }        }        return databaseType;    }    private void closeDatabase(Liquibase liquibase) {        if (liquibase != null) {            Database database = liquibase.getDatabase();            if (database != null) {                try {                    database.close();                } catch (DatabaseException e) {                    log.warn("Error closing database", e);                }            }        }    }}

关于“MybatisPlus整合Flowable出现错误怎么解决”这篇文章的内容就介绍到这里,感谢各位的阅读!相信大家对“MybatisPlus整合Flowable出现错误怎么解决”知识都有一定的了解,大家如果还想学习更多知识,欢迎关注编程网精选频道。

--结束END--

本文标题: MybatisPlus整合Flowable出现错误怎么解决

本文链接: https://lsjlt.com/news/354549.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • MybatisPlus整合Flowable出现错误怎么解决
    这篇文章主要介绍了MybatisPlus整合Flowable出现错误怎么解决的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇MybatisPlus整合Flowable出现错误怎么解决文章都会有所收获,下面我们一起...
    99+
    2023-07-05
  • MybatisPlus+Postgresql整合的坑怎么解决
    本篇内容主要讲解“MybatisPlus+Postgresql整合的坑怎么解决”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“MybatisPlus+Postgresql整合的坑怎么解决”吧!基础...
    99+
    2023-07-05
  • 出现 java.lang.NoSuchMethodError错误怎么解决
    这篇文章将为大家详细讲解有关出现 java.lang.NoSuchMethodError错误怎么解决,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。解决 java.lang.NoSuchMet...
    99+
    2023-05-31
    java nosuchmethoderror ava
  • MySQL出现1075错误怎么解决
    小编给大家分享一下MySQL出现1075错误怎么解决,希望大家阅读完这篇文章后大所收获,下面让我们一起去探讨吧!MySQL1075错误是因为表内有其他自动递增的列,系统默认其是主键,其解决办法就是将设为自增...
    99+
    2024-04-02
  • MySQL出现1067错误怎么解决
    本篇内容主要讲解“MySQL出现1067错误怎么解决”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“MySQL出现1067错误怎么解决”吧!内容:********...
    99+
    2024-04-02
  • SQL出现5120错误怎么解决
    SQL Server 错误 5120 是由于没有足够的权限来访问或操作指定的数据库或文件引起的。以下是解决此问题的几种方法:1. 检...
    99+
    2023-09-22
    SQL
  • Windows出现​CoCreateInstance错误怎么解决
    CoCreateInstance错误是由于无法创建指定的COM组件实例所引起的。要解决这个问题,可以尝试以下步骤: 确认COM组...
    99+
    2023-10-21
    Windows
  • Oracle出现ora-12154错误怎么解决
    ORA-12154错误通常表示Oracle客户端无法解析数据库的连接信息。以下是一些常见的解决方法: 确保tnsnames.or...
    99+
    2023-10-23
    Oracle
  • myeclipse运行出现错误怎么解决
    当MyEclipse运行出现错误时,你可以尝试以下解决方法:1. 重启MyEclipse:有时候重启软件可以解决一些临时性的问题。2...
    99+
    2023-08-18
    myeclipse
  • tomcat6.0运行出现错误怎么解决
    要解决Tomcat 6.0运行出现的错误,可以尝试以下几种方法:1. 检查Tomcat配置文件:确保配置文件(如server.xml...
    99+
    2023-08-18
    tomcat
  • 连接MySQL出现2013错误怎么解决
    这篇文章主要介绍“连接MySQL出现2013错误怎么解决”,在日常操作中,相信很多人在连接MySQL出现2013错误怎么解决问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”连接...
    99+
    2024-04-02
  • MySql出现错误代码1045怎么解决
    本篇内容介绍了“MySql出现错误代码1045怎么解决”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!错误代...
    99+
    2024-04-02
  • mysql出现系统错误1058怎么解决
    本篇内容介绍了“mysql出现系统错误1058怎么解决”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成! ...
    99+
    2024-04-02
  • Win8开机出现错误C00000022怎么解决
    本篇内容主要讲解“Win8开机出现错误C00000022怎么解决”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Win8开机出现错误C00000022怎么解决”吧!解决方法:一、重启电脑,接着按住...
    99+
    2023-06-28
  • delphi调用dll出现错误怎么解决
    要解决Delphi调用DLL出现错误,可以按照以下步骤进行尝试: 确认DLL文件路径是否正确:检查DLL文件是否在正确的路径下,...
    99+
    2023-10-25
    delphi
  • SQL语句出现ora06502错误怎么解决
    ORA-06502错误通常是由于数据类型不匹配引起的,可能有以下几种原因和解决方法:1. 传递的参数与目标变量的数据类型不匹配。请确...
    99+
    2023-10-18
    SQL
  • windows出现错误码0x803f8001怎么解决
    本篇内容主要讲解“windows出现错误码0x803f8001怎么解决”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“windows出现错误码0x803f8001怎么解决”吧!...
    99+
    2023-07-01
  • VC出现unresolved external symbol错误怎么解决
    "unresolved external symbol"错误通常发生在链接阶段,表示编译器找不到某个函数或变量的定义。解决这个错误的...
    99+
    2023-08-08
    VC
  • mysql连接出现1045错误怎么解决
    MySQL的错误代码1045表示访问被拒绝,通常是由于用户名或密码错误导致的。要解决此问题,可以按照以下步骤操作:1. 确认用户名和...
    99+
    2023-08-11
    mysql
  • C++调用AdjustTokenPrivileges出现错误怎么解决
    调用AdjustTokenPrivileges函数时可能会出现错误,常见的错误有以下几种: ERROR_NOT_ALL_ASSIG...
    99+
    2023-10-27
    C++
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作