2023-04-18-复杂的bug收录

搞不定的bug搞定花了好些时间

Posted by lily on April 20, 2023

复杂的bug收录


Mysql字符集编码问题

mybatis-plus与springboot整合版本问题

mybatis spring boot starter的版本选择要求与MyBatis、MyBatis-Spring、Java和Spring Boot的版本有关。例如:

  • 如果您使用的是MyBatis 3.5+、MyBatis-Spring 3.0、Java 17+和Spring Boot 3.0-3.1(尚未发布),您可以使用mybatis spring boot starter的master分支。
  • 如果您使用的是MyBatis 3.5+、MyBatis-Spring 2.0+、Java 8+和Spring Boot 2.1-2.6,您可以使用mybatis spring boot starter的2.3.x分支。
  • 如果您使用的是MyBatis 3.4+、MyBatis-Spring 1.3+、Java 6+和Spring Boot 1.4-2.0,您可以使用mybatis spring boot starter的1.3.x分支。

可以在GitHub上查看mybatis spring boot starter的不同分支和版本信息¹

与必应的对话, 2023/5/15 (1) GitHub - mybatis/spring-boot-starter: MyBatis integration with …. https://github.com/mybatis/spring-boot-starter. (2) mybatis-spring. https://mybatis.org/spring/ja/boot.html. (3) mybatis-spring. https://mybatis.org/spring/boot.html.


报错:无法找到”UserDao”的bean

  1. 检查bean能否被成功创建出类对象(从接口–>实现类)
    1. bean的创建相关依赖,yml配置是否正确
    2. mapper层的接口是否创建有误
  2. 检查bean能否被成功注入到类中(从实现类–>使用类)
    1. 基于boot的项目,有无添加@mapper或@Repository注解
    2. 有无在启动类上添加@MapperScan注解,成功扫描到mapper层
  3. 检查额外功能在添加时否出现逻辑错误
    Parameter 0 of constructor in com.catgod.service.Impl.UserServiceImp required 
    a bean of type 'com.catgod.dao.UserDao' that could not be found
    

这个错误是由于Spring无法找到一个能够满足自动装配的条件的UserDao Bean,导致无法将其注入到UserServiceImp的baseMapper属性中。 这个错误提示说明在 UserServiceImp 类的构造函数中,需要一个名为 userDao ,类型为 com.catgod.dao.UserDao 的 bean,但是在 Spring 容器中没有找到对应的 bean。可能有以下几种原因导致该问题:

  1. 没有在 UserDao 的实现类上添加 @Repository@Mapper 注解,导致 Spring 无法识别该类并将其注入到容器中。

  2. UserDao 的实现类上添加了 @Mapper 注解,但没有在 Spring Boot 启动类上添加 @MapperScan 注解来扫描该包中的 mapper,导致无法将 mapper 注入到容器中。

  3. UserDao 的实现类可能没有放在 Spring Boot 扫描包的范围之内,需要将其所在的包添加到扫描范围中。
  4. 引入mybatis-spring-boot-starter依赖,但是没有引入mybatis依赖,导致无法注入mapper接口

  5. UserDao没有被正确地声明为一个Spring Bean。在 UserDao 类上添加 @Repository 注解或在配置文件中声明该 Bean 可以解决这个问题。
  6. UserDao接口没有被实现,或者实现类上没有添加 @Repository 注解。这样也会导致Spring无法找到满足条件的Bean。
  7. 在配置文件中没有配置数据源或者数据源配置有误,导致 UserDao 无法正常创建。可以检查数据源配置是否正确。
  8. 在注入时使用了错误的属性名称。检查 UserServiceImp 类中的 baseMapper 属性名是否正确,并确保 UserDao 中的字段名和类型与 baseMapper 的定义相同。

以上是可能导致该错误的原因之一,具体问题需要具体分析。

重点

@SpringBootApplication(scanBasePackages = {"com.catgod"})
// load mybatis mapper
@MapperScan("com.catgod.Dao")
public class SpringbootApplication {...
// 启动类

基础包扫描和mapper扫描是两个不同的东西,基础包扫描是为了扫描sprnigboot项目中的基础注解以及配置类等,mapper扫描是为了扫描@mapper注解接口,为了自动为其生成代理对象,这样在service中就可以直接注入mapper接口,而不用自己实现mapper接口的实现类。


报错:

mybatis依赖与mybatis-plus依赖之间的关系

 <!--  mybatis依赖    -->
        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>2.1.3</version>
        </dependency>
        <!--  mybatis-plus支持 -->
        <!--  如果想要同时使用mybatis,务必提高mybatis-plus的版本!!!      -->
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
            <version>3.3.0</version>
        </dependency

篇文章能对您有所帮助。以下是继续补充的文章内容,包含了代码引用:

SQL: SELECT username,password FROM tb_user WHERE (name = ?)

在使用 Spring Security 和 MyBatis-Plus 的过程中,遇到了一个查询条件不匹配的问题。通过以下步骤,我们成功找到并解决了这个问题。

  1. 问题描述 :应用程序报错,提示 SQL 查询语句中的查询条件不正确。

  2. 分析代码 :我们首先检查了实体类、数据库表结构和相关配置,确认它们是一致的。然后注意到查询条件中的属性名 name 与我们的预期不符。

  3. 排查实体类 :我们仔细查看了实体类 User 的代码,发现属性名和注解 @TableField 配置的数据库字段名都是正确的。

public class User {

    @TableField(value = "username")
    private String username;
    
    @TableField(value = "password")
    private String password;

    // 省略其他代码
}
  1. 查看调用关系 :我们查看了调用 getUserByName 方法的地方,发现它是在 UserServiceImpl 类中定义的。
@Service
public class UserServiceImpl extends ServiceImpl<UserDao, User> implements UserService {

    @Autowired
    private UserDao userDao;

    public User getUserByName(String name){
        QueryWrapper<User> wrapper = new QueryWrapper<>();
        wrapper.eq("name", name);
        return userDao.selectOne(wrapper);
    }
    
    // 省略其他代码
}
  1. 检查查询方法 :我们检查了 UserServiceImpl 类中的 getUserByName 方法的实现,发现在查询条件中使用的是属性名 name 而不是正确的属性名 username
public User getUserByName(String name){
    QueryWrapper<User> wrapper = new QueryWrapper<>();
    wrapper.eq("name", name);
    return userDao.selectOne(wrapper);
}
  1. 修复代码 :为了修复问题,我们将查询条件中的属性名改为正确的 username ,并重新测试应用程序。
public User getUserByName(String username){
    QueryWrapper<User> wrapper = new QueryWrapper<>();
    wrapper.eq("username", username);
    return userDao.selectOne(wrapper);
}
  1. 问题解决 :通过上述修复,我们成功解决了查询条件不匹配的问题,并确保应用程序能够正常运行。

以上是关于我们如何寻找并解决查询条件不匹配问题的过程。我们通过仔细分析代码、查看调用关系和检查查询方法的实现,定位到了问题所在,并修复了代码。

希望这篇文章能对您有所帮助。如果有任何其他问题,请随时提问。