白茶三许 2026-01-10 16:06 采纳率: 0%
浏览 14

LangChain4j与mybatisplus冲突


org.springframework.beans.factory.BeanDefinitionStoreException: Invalid bean definition with name 'appointmentMapper' defined in file [D:\JavaNewCode\SpringAiProject\langchain4j-java-ai\target\classes\org\exam\langchain4j\mapper\AppointmentMapper.class]: Invalid value type for attribute 'factoryBeanObjectType': java.lang.String
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.getTypeForFactoryBean(AbstractAutowireCapableBeanFactory.java:858) ~[spring-beans-6.2.5.jar:6.2.5]
    at org.springframework.beans.factory.support.AbstractBeanFactory.getType(AbstractBeanFactory.java:745) ~[spring-beans-6.2.5.jar:6.2.5]
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.findAnnotationOnBean(DefaultListableBeanFactory.java:791) ~[spring-beans-6.2.5.jar:6.2.5]
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.findAnnotationOnBean(DefaultListableBeanFactory.java:782) ~[spring-beans-6.2.5.jar:6.2.5]
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBeanNamesForAnnotation(DefaultListableBeanFactory.java:752) ~[spring-beans-6.2.5.jar:6.2.5]
    at dev.langchain4j.service.spring.AiServiceScannerProcessor.addComponentScanPackages(AiServiceScannerProcessor.java:49) ~[langchain4j-spring-boot-starter-1.10.0-beta18.jar:na]
    at dev.langchain4j.service.spring.AiServiceScannerProcessor.getBasePackages(AiServiceScannerProcessor.java:43) ~[langchain4j-spring-boot-starter-1.10.0-beta18.jar:na]
    at dev.langchain4j.service.spring.AiServiceScannerProcessor.postProcessBeanDefinitionRegistry(AiServiceScannerProcessor.java:29) ~[langchain4j-spring-boot-starter-1.10.0-beta18.jar:na]
    at org.springframework.context.support.PostProcessorRegistrationDelegate.invokeBeanDefinitionRegistryPostProcessors(PostProcessorRegistrationDelegate.java:349) ~[spring-context-6.2.5.jar:6.2.5]
    at org.springframework.context.support.PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors(PostProcessorRegistrationDelegate.java:148) ~[spring-context-6.2.5.jar:6.2.5]
    at org.springframework.context.support.AbstractApplicationContext.invokeBeanFactoryPostProcessors(AbstractApplicationContext.java:791) ~[spring-context-6.2.5.jar:6.2.5]
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:609) ~[spring-context-6.2.5.jar:6.2.5]
    at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:146) ~[spring-boot-3.4.4.jar:3.4.4]
    at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:752) ~[spring-boot-3.4.4.jar:3.4.4]
    at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:439) ~[spring-boot-3.4.4.jar:3.4.4]
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:318) ~[spring-boot-3.4.4.jar:3.4.4]
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:1361) ~[spring-boot-3.4.4.jar:3.4.4]
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:1350) ~[spring-boot-3.4.4.jar:3.4.4]
    at org.exam.langchain4j.LangChain4jApplication.main(LangChain4jApplication.java:11) ~[classes/:na]

LangChain4j扫描和Mybatis-Plus的扫描出现冲突了怎么办

  • 写回答

3条回答 默认 最新

  • 檀越@新空间 2026-01-10 16:07
    关注

    下午好🌅🌅🌅
    本答案参考通义千问

    你遇到的错误是 LangChain4jMyBatis-Plus 在 Spring Boot 应用中扫描组件时发生冲突,导致 BeanDefinitionStoreException。具体错误信息如下:

    Invalid value type for attribute 'factoryBeanObjectType': java.lang.String
    

    这通常是因为 LangChain4j 的扫描机制(如 AiServiceScannerProcessor)和 MyBatis-Plus 的扫描机制(如 @MapperScan)在处理某些 Bean 定义时产生了冲突。


    问题原因分析

    1. LangChain4j 的扫描机制:它会扫描特定包下的 AI 服务类,并尝试将其注册为 Spring Bean。
    2. MyBatis-Plus 的扫描机制:它会扫描 Mapper 接口并生成代理对象。
    3. 冲突点:如果两个扫描器都试图处理同一个类(比如一个接口或类),Spring 无法正确解析其类型,从而抛出 BeanDefinitionStoreException

    🔧 解决方案

    以下是解决该冲突的详细步骤:

    1. 明确扫描路径,避免重叠

    确保 LangChain4j 和 MyBatis-Plus 的扫描路径不重叠,或者明确指定各自的扫描范围。

    @Configuration
    @MapperScan("org.exam.langchain4j.mapper") // MyBatis-Plus 的 Mapper 扫描路径
    public class MyBatisPlusConfig {
    }
    

    同时,在 LangChain4j 的配置中,避免扫描包含 MyBatis-Plus Mapper 的包:

    @Configuration
    @EnableAiServices(basePackages = "org.exam.langchain4j.service") // 只扫描 AI 服务类
    public class LangChain4jConfig {
    }
    

    重点: 确保 @EnableAiServices@MapperScan 指向不同的包路径,避免重复扫描。


    2. 排除冲突的 Bean 类型

    你可以通过自定义扫描处理器来排除某些类型的 Bean,防止它们被错误地识别为 AI 服务。

    例如,创建一个自定义的 AiServiceScannerProcessor 来过滤掉 MyBatis-Plus 的 Mapper 接口:

    import dev.langchain4j.service.spring.AiServiceScannerProcessor;
    import org.springframework.beans.factory.config.BeanDefinition;
    import org.springframework.context.annotation.AnnotationBeanNameGenerator;
    import org.springframework.core.type.AnnotationMetadata;
    import org.springframework.stereotype.Component;
    
    @Component
    public class CustomAiServiceScannerProcessor extends AiServiceScannerProcessor {
    
        @Override
        protected void doProcess(AnnotationMetadata metadata, BeanDefinition beanDefinition) {
            String className = beanDefinition.getBeanClassName();
            if (className != null && className.endsWith("Mapper")) {
                return; // 跳过 MyBatis-Plus 的 Mapper 接口
            }
            super.doProcess(metadata, beanDefinition);
        }
    }
    

    重点: 通过自定义扫描器过滤掉可能引起冲突的 Bean 类型。


    3. 升级依赖版本

    确保使用的是兼容的 LangChain4j 和 MyBatis-Plus 版本。如果你使用的是 LangChain4j 1.10.0-beta18,建议检查是否有更新的版本可用。

    例如,将 langchain4j-spring-boot-starter 升级到最新稳定版:

    <dependency>
        <groupId>dev.langchain4j</groupId>
        <artifactId>langchain4j-spring-boot-starter</artifactId>
        <version>1.11.0</version> <!-- 假设这是最新的稳定版 -->
    </dependency>
    

    重点: 使用兼容性更好的版本可以减少潜在的冲突。


    4. 手动注册 Bean(可选)

    如果以上方法无效,可以考虑手动注册那些容易冲突的 Bean,而不是依赖自动扫描。

    例如,手动注册 MyBatis-Plus 的 Mapper:

    @Configuration
    public class MyBatisPlusConfig {
    
        @Bean
        public AppointmentMapper appointmentMapper() {
            return new AppointmentMapperImpl(); // 如果是接口,可能需要使用 ProxyFactory
        }
    }
    

    重点: 避免让 Spring 自动扫描这些 Bean,以防止冲突。


    📝 总结

    | 步骤 | 内容 | |------|------| | 1 | 明确扫描路径,避免 LangChain4j 和 MyBatis-Plus 的扫描路径重叠 | | 2 | 创建自定义扫描处理器,排除冲突的 Bean 类型 | | 3 | 升级 LangChain4j 和 MyBatis-Plus 到兼容版本 | | 4 | 手动注册容易冲突的 Bean(可选) |


    🧩 示例代码修改(如果适用)

    如果你的项目中有如下配置:

    @EnableAiServices
    @MapperScan("org.exam.langchain4j.mapper")
    @SpringBootApplication
    public class LangChain4jApplication {
        public static void main(String[] args) {
            SpringApplication.run(LangChain4jApplication.class, args);
        }
    }
    

    请修改为:

    @EnableAiServices(basePackages = "org.exam.langchain4j.service") // 只扫描 AI 服务
    @MapperScan("org.exam.langchain4j.mapper") // 只扫描 MyBatis-Plus Mapper
    @SpringBootApplication
    public class LangChain4jApplication {
        public static void main(String[] args) {
            SpringApplication.run(LangChain4jApplication.class, args);
        }
    }
    

    如果你能提供具体的项目结构或相关代码片段,我可以进一步帮助你定位问题根源。

    评论

报告相同问题?

问题事件

  • 创建了问题 1月10日