Skip to content

项目搭建注解补充说明

hongjiatao edited this page Jul 29, 2022 · 1 revision

项目搭建注解补充说明

1.注解@ComponentScan说明

  • 扫描含有@Component,@Controller,@Service和@Repository的类,并将其注入到spring容器中。

  • 扫描含有@Configuration的类,并使其生效。

    package com.nrsc.springstudy.c1_componentscan.config;
    
    import com.nrsc.springstudy.c1_componentscan.config2_test.OrderRepository2;
    import org.springframework.context.annotation.ComponentScan;
    import org.springframework.context.annotation.ComponentScan.Filter;
    import org.springframework.context.annotation.Configuration;
    import org.springframework.context.annotation.FilterType;
    
    //标识此类为注解类
    @Configuration
    //扫描config2_test目录,并排除OrderRepository2类
    @ComponentScan(value = "com.nrsc.springstudy.c1_componentscan.config2_test",
            excludeFilters = {@Filter(type = FilterType.ASSIGNABLE_TYPE, classes = {OrderRepository2.class})})
    public class Config2 {
    }
    com.nrsc.springstudy.c1_componentscan.config2_test  这个是Config2当前类中的包路径

    swagger出现找不到

image

原因:出现路径接口报404,也就是服务没找到该路径,可是查看了代码是有的。

解决方案:把这个注解注释掉

image

2.当maven中的pom文件出现灰色,并且有下划线

image

解决方案 :Settings-->Maven-->Ignored Files --> 把勾去掉即可

3.mysql出现字段都是存问号???的问题

image

经排查,数据库字符集类型包括表的字符集类型都是utf-8

image-20220712141341888

解决方案:在yml配置文件中的数据库连接预计加以下语句

&useUnicode=yes&characterEncoding=utf8

完整MySql连接语句如下:

#spring
spring:
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://xxxxxx:3307/demo-spring-boot-mybatis-plus?useUnicode=true&useSSL=false&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=UTC&useUnicode=yes&characterEncoding=utf8
    username: xxxx
    password: xxxxx
    hikari: 
        max-lifetime: 500000

数据库Mysql也要设置

[mysqld]
character-set-server=utf8
[client]
default-character-set=utf8
[mysql]
default-character-set=utf8

如果你是用docker部署,并且没映射出容器的地址,这时候mysql.cnf配置在

image

这时候把上面三个配置加进去,重启docker中的mysql容器即可。

然后进入mysql查看配置是否生效

show variables like ‘character%’;

image

一样的话表示你已经配置成功了。

4.注解@Transactional详解

@Transactional是我们项目中很常用的一个注解了,@Transactional可以为我们控制事务,可以保证事务内的操作要么全部成功,要么全部失败,@Transactional也是基于AOP切面实现事务的功能的。 下面列举一下使用@Transactional会导致事务失效的场景:

1、@Transactional应用在了非public的方法上,事务将会失效:

原因是SpringAOP对事务进行代理增强的时候会调用到computeTransactionAttribute方法,这个方法里面进行了判断,会检查目标方法是否是publice修饰,如果不是public修饰,则事务不会生效;

protected TransactionAttribute computeTransactionAttribute(Method method,
    Class<?> targetClass) {
        // Don't allow no-public methods as required.
        if (allowPublicMethodsOnly() && !Modifier.isPublic(method.getModifiers())) {
        returnnull;
}

2、在同一个类中调用@Transactional注解的方法会失效:

比如有一个UserManager类,里面有一个方法A,一个方法B,方法B也加了@Transactional注解,如果在方法A中直接调用方法B,B的事务是不会生效的,原因是AOP,AOP只有方法在被类对象调用的时候才会增强;

2、在同一个类中调用@Transactional注解的方法会失效: 比如有一个UserManager类,里面有一个方法A,一个方法B,方法B也加了@Transactional注解,如果在方法A中直接调用方法B,B的事务是不会生效的,原因是AOP,AOP只有方法在被类对象调用的时候才会增强;

3、没有设置 rollbackFor或者 rollbackFor设置错误导致事务失效:

rollbackFor是用来指定遇到哪种异常时,对事务进行回滚,如果不设置,则遇到异常不会回滚,一般情况都要设置成@Transactional(rollbackFor = Exception.class),遇到任何异常都回滚;

4、设置了 rollbackFor却被catch了,导致事务失效:

@Transactional(rollbackFor = Exception.class)正确设置了rollbackFor,可是却在代码中进行了try catch,导致异常不能抛出,从而导致事务失效; 例如:

@Transactional(rollbackFor = Exception.class)
public void save(User user){
	try(
		service1.save(user);
		service2.update(user.getId());
	)catch(Exception e){
	// 这里对Excaption进行了catch,导致异常无法抛出,事物就不会生效,正确做法是直接抛出异常
		e.printStackTrace();
	}

5、@Transactional的propagation属性设置错误,导致事物失效:

propagation如果配置为如下三种,很容易导致事务失效:

@Transactional的propagation属性设置错误,导致事物失效: propagation如果配置为如下三种,很容易导致事务失效:

ransactionDefinition.PROPAGATION_SUPPORTS:如果当前存在事务,则加入该事务;如果当前没有事务,则以非事务的方式继续运行。 TransactionDefinition.PROPAGATION_NOT_SUPPORTED:以非事务方式运行,如果当前存在事务,则把当前事务挂起。 TransactionDefinition.PROPAGATION_NEVER:以非事务方式运行,如果当前存在事务,则抛出异常。

5.mybatis-plus实体类id

注解@TableId

   @TableId(value = "USER_ID", type = IdType.AUTO)
    @ApiModelProperty(value = "用户ID")
    private Long userId;

其中,user_id是要与数据库user表中的id对于上,否则执行mybatis-plus的CRUD会有问题

引入依赖

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>