gitignore和@Primary的小技巧

131 阅读3分钟

image.png

事情是酱紫的

开发过程中,总会遇到一些不起眼但又很恶心人的问题,比如

  1. 本地调试,有个方法要获取当前用户(一般都是从token中获取),所以又得去数据库翻一下,找到登陆token,放到postman里面,如果找不到这个用户的token,你还得去拿账号密码去调一下登陆接口
  2. 某次迭代开发,你依赖的一个Service方法的返回值,需要增加一个字段,但负责开发的同事还没做好,所以你也没办法开始测试,直接改他的代码造假数据吧,又怕冲突,不改吧,自己又不好测

这些问题有个共同点,就是都是小问题,但却让人很难受。

怎么办

@Primary注解

这是spring提供的注解,可以加到类上,spring在进行依赖注入的时候,如果发现这个字段的类型,有多个bean,则优先注入有@Primary的,比如

有一个UserService,写了两个实现类,UserService1和UserService2,其中UserService1上,有@Primary,那么spring自动注入UserService,则会选择UserService1。

gitignore

可以把一些文件或者目录添加到gitignore里面去,这样git就会忽略掉这些内容,idea有插件,用起来很方便

image.png

代码演示

准备工作

在自己项目中,建一个叫ignored的package(包的位置,要能够被spring扫描到),并将它加入到gitignore中,这样这个包下面的所有内容,都会被git忽略掉。idea会在颜色上有所区分。

image.png

获取当前登录的用户

一般都是一个工具类来实现的,但这种方式明显对本地调试不太友好

public class UserUtil {

    public static Integer getCurrentUserId(){
        //解析token,然后获取用户id
        return 1;
    }
}

所以可以写一个接口CurrentUserService

public interface CurrentUserService{
    Integer currentUserId();
}

然后写个正常的实现类

@Service
public class CurrentUserServiceImpl implements CurrentUserService {
    @Override
    public Integer currentUserId() {
        return UserUtil.getCurrentUserId();
    }
}

业务代码里获取当前用户就不要用工具类了,直接注入CurrentUserservice

@Service
public class ProductServiceImpl implements ProductService {
    
    @Autowired
    private CurrentUserService currentUserService;
    
    @Override
    public ProductVo get(Integer id) {
        //获取当前登录的用户
        Integer currentUserId = currentUserService.currentUserId();
        //业务代码略
        return null;
    }
}

在gitignored包下,再写个实现类,自定义获取用户id的方法(我一般从请求头里获取)

@Service
@Primary
public class LocalCurrentUserService implements CurrentUserService {
    @Autowired
    private HttpServletRequest request;
    
    @Override
    public Integer currentUser() {
        return Integer.valueOf(request.getHeader("userId"));
    }
}

这样在本地调试的时候,就完全可以很方便的自定义当前用户的id了,也完全不用担心会影响到项目代码

未完成的接口模拟调试数据

有了上面的技巧,这种问题也是一样的思路,比如你需要一个ProductService,但是负责开发的人,还没写完,你就可以自己在gitignored里面加一个实现类打上@Primary注解,按照你的需求,自己写一些假数据进来

接口需要强制登录

有的接口需要强制登录才能访问,但是否登录这个是全局设置,不影响功能测试,如果是使用的SpringSecurity

Step1,在开发环境的配置中,加上这么一句,这样所有OnlyTest为前缀的请求,都不用经过登录校验,但要做好注释,避免有人不知情同步到其他环境中

image.png

Step2,在gitignored包中,给你需要测试的controller,写一个子类,类上的注解全部复制过来(方法字段都不用复制),并在@RequestMapping前面加一个OnlyTest

要测试的controller

image.png gitignored包下的子类

image.png

这么一来,就能绕开登录校验,也不用担心会改错项目代码

结尾

本文就是介绍一些我在项目中用的的“骚操作”,在提升开发体验的同时,也能学习一些框架上的技巧