baomidou / mybatis-plus

An powerful enhanced toolkit of MyBatis for simplify development
https://baomidou.com
Apache License 2.0
16.42k stars 4.31k forks source link

关于升级到SpringBoot3.2后,构建Spring Native镜像运行时报错,找不到Mapper问题 #5826

Closed XuYaoAnansi closed 11 months ago

XuYaoAnansi commented 11 months ago

当前使用版本(必填,否则不予处理)

SpringBoot: 3.2 mybatis-plus-spring-boot3-starter: 3.5.5-SNAPSHOT

该问题是如何引起的?(确定最新版也有问题再提!!!)

该问题应该是升级Spring6.1.1后相关的没有适配,导致的,拜托麻烦解决下^_^

重现步骤(如果有就写完整)

通过测试工程:https://github.com/nieqiurong/mybatis-native-demo.git可以复现,把工程的SpringBoot升级到3.2,mybatis-plus-spring-boot3-starter升级到3.5.5-SNAPSHOT,然后生成镜像,运行时会产生该问题

报错信息

image

pigeon2049 commented 11 months ago

+1

pigeon2049 commented 11 months ago

就差mybatis-plus解决这个问题就能把项目编译成native了

scafel commented 11 months ago

去掉mp的mybatis-spring 自己更新到3.0.3

XuYaoAnansi commented 11 months ago

去掉mp的mybatis-spring 自己更新到3.0.3

不行,我用的就是3.0.3,正常运行没问题,但是native镜像运行就有问题,不过我觉得应该问题还是在mybatis那边注入@Mapper的时候产生的问题,但是不知道怎么解决

stander commented 11 months ago

跟这个issue情况类似,但是mybatis还没有提供解决方案 https://github.com/mybatis/spring-native/issues/128

XuYaoAnansi commented 11 months ago

跟这个issue情况类似,但是mybatis还没有提供解决方案 mybatis/spring-native#128

是的,我也找到这个issue,但是没啥动静,智能等mybatis那边了吗?

XuYaoAnansi commented 11 months ago

我解决了这个问题,应该是在Spring6.1之前对有参数注入和无参注入做了忽略,现在要强匹配了,加上代码 ConstructorArgumentValues constructorArgumentValues = new ConstructorArgumentValues(); constructorArgumentValues.addGenericArgumentValue(mapperInterface); beanDefinition.setConstructorArgumentValues(constructorArgumentValues); 就可以了

nieqiurong commented 11 months ago

我解决了这个问题,应该是在Spring6.1之前对有参数注入和无参注入做了忽略,现在要强匹配了,加上代码 ConstructorArgumentValues constructorArgumentValues = new ConstructorArgumentValues(); constructorArgumentValues.addGenericArgumentValue(mapperInterface); beanDefinition.setConstructorArgumentValues(constructorArgumentValues); 就可以了

可以,按你的方式更新一下.

stander commented 11 months ago

按照上述方法修改了MybatisNativeConfiguration,现在可以启动,但是查询时出现以下报错 NoSuchMethodException: org.apache.ibatis.type.EnumTypeHandler

pudisdo commented 11 months ago

我解决了这个问题,应该是在Spring6.1之前对有参数注入和无参注入做了忽略,现在要强匹配了,加上代码 ConstructorArgumentValues constructorArgumentValues = new ConstructorArgumentValues(); constructorArgumentValues.addGenericArgumentValue(mapperInterface); beanDefinition.setConstructorArgumentValues(constructorArgumentValues); 就可以了

按照你的方法修改,成功解决了。谢谢。

XuYaoAnansi commented 11 months ago

NoSuchMethodException

NoSuchMethodException这种异常在native可以尝试hint下,不是这个issue提出的问题

choubuzhaole commented 11 months ago

我解决了这个问题,应该是在Spring6.1之前对有参数注入和无参注入做了忽略,现在要强匹配了,加上代码 ConstructorArgumentValues constructorArgumentValues = new ConstructorArgumentValues(); constructorArgumentValues.addGenericArgumentValue(mapperInterface); beanDefinition.setConstructorArgumentValues(constructorArgumentValues); 就可以了

能给我 一个完整的示例吗,谢谢

我使用以下调整未能解决这个问题 ` // 获取所有带有 @Mapper 注解的类

        @Autowired
        private GenericBeanDefinition beanDefinition;

    String[] mapperBeanNames = applicationContext.getBeanNamesForAnnotation(Mapper.class);
    // 使用 ConstructorArgumentValues 注入所有 mapper 实现类
    ConstructorArgumentValues constructorArgs = new ConstructorArgumentValues();
    for (String beanName : mapperBeanNames) {
        constructorArgs.addGenericArgumentValue(new RuntimeBeanReference(beanName));
    }
    beanDefinition.setConstructorArgumentValues(constructorArgs);

`

amwyyyy commented 4 months ago

我解决了这个问题,应该是在Spring6.1之前对有参数注入和无参注入做了忽略,现在要强匹配了,加上代码 ConstructorArgumentValues constructorArgumentValues = new ConstructorArgumentValues(); constructorArgumentValues.addGenericArgumentValue(mapperInterface); beanDefinition.setConstructorArgumentValues(constructorArgumentValues); 就可以了

能给我 一个完整的示例吗,谢谢

我使用以下调整未能解决这个问题 ` // 获取所有带有 @Mapper 注解的类

        @Autowired
        private GenericBeanDefinition beanDefinition;

  String[] mapperBeanNames = applicationContext.getBeanNamesForAnnotation(Mapper.class);
  // 使用 ConstructorArgumentValues 注入所有 mapper 实现类
  ConstructorArgumentValues constructorArgs = new ConstructorArgumentValues();
  for (String beanName : mapperBeanNames) {
      constructorArgs.addGenericArgumentValue(new RuntimeBeanReference(beanName));
  }
  beanDefinition.setConstructorArgumentValues(constructorArgs);

`

private void resolveMapperFactoryBeanTypeIfNecessary(RootBeanDefinition beanDefinition) {
      if (!beanDefinition.hasBeanClass() || !MapperFactoryBean.class.isAssignableFrom(beanDefinition.getBeanClass())) {
        return;
      }
      if (beanDefinition.getResolvableType().hasUnresolvableGenerics()) {
        Class<?> mapperInterface = getMapperInterface(beanDefinition);
        if (mapperInterface != null) {
            ConstructorArgumentValues constructorArgumentValues = new ConstructorArgumentValues();
            constructorArgumentValues.addGenericArgumentValue(mapperInterface);
            beanDefinition.setConstructorArgumentValues(constructorArgumentValues);
            beanDefinition.setConstructorArgumentValues(constructorArgumentValues);
            beanDefinition.setTargetType(ResolvableType.forClassWithGenerics(beanDefinition.getBeanClass(), mapperInterface));
        }
      }
    }