对于java开发的一些小技巧

前言

出社会工作已经有5个月了。这五个月怎么说呢,太过于煎熬,感觉前途有点茫然,学的东西也不是很多,虽然还没正式毕业,但是已经算是半个踏入社会的人了,下面我将记录下我这五个月认识到的一些皮毛;

1. BeanUtils(org.springframework.beans.BeanUtils)

之前我的开发流程是:后端获取数据库的数据,然后遍历,该转换的转换,在一个个set到对应的Vo实体类中去。或者vo中写个有参构造方法,那样会沉积很多代码,然后我认识到了BeanUtils中copyProperties(参数1,参数2,参数3)方法;即可解决,参数1:源数据,参数2,目标数据,也就是说把参数1拷贝的参数2中去,注意:只会拷贝字段名相同且类型相同的字段;参数三:不需要那些字段转换,多个string类型

2.spring.profiles.active(线上版本与线上版本的切换)

不知道其他的公司是怎么做的。我这里是,线下测试完之后,要改applicable.yml文件的配置(比如:数据库,redis,等等),然后提交上去,如果又要测试又要改这些,稍微不注意就会把线下的配置提交到线上去了。所以我发现了spring.profiles.active,首先创建两个同级的以applicable-开头的yml文件(比如:applicable-dev.yml:测试版本;applicable-release.yml:线上版本)然后把不同的配置分别写入到对应的yml文件去,吧相同的配置写在applicable.yml中去,再到applicable.yml加入spring:profiles:active: 值; 这个值就代表你要引用哪个配置,(比如你要引用applicable-dev.yml,就是spring:profiles:active:dev),这样的话只需要改一行就可以了;

3.统一异常类@RestControllerAdvice注解

在开发过程中有很多异常以及错误是想给用户看的,但是每次都用try catch()很不方便的。那么只要有这样的异常直接想上一级抛出,然后用一个统一异常去处理这些错误即可。写个例子

@RestControllerAdvice
public class ExceptionHandleAdvice {

    /**
     * 参数验证拦截
     * @param e
     * @return
     */
    @ExceptionHandler(MethodArgumentNotValidException.class)
    public APIResult<?> handleValidException(MethodArgumentNotValidException e){
        StringJoiner sb = new StringJoiner(",");
        BindingResult result = e.getBindingResult();
        for(ObjectError error : result.getAllErrors()){
            sb.add(error.getDefaultMessage());
        }
        return APIResult.error(ResCodeEnum.VALIDATOR_ERROR.getErrCode(),sb.toString());
    }
    /**
     *其他错误拦截
     * @param e
     * @return
     */
    @ExceptionHandler(Exception.class)
    public APIResult<?> handleValidException(Exception e){
        return APIResult.error(ResCodeEnum.ERROR.getErrCode(),e.getMessage());
    }
}

第一个方法是参数校验错误,下面可以讲到,第二个方法是获取是Exception的异常,然后解析,友好的返回给前台,当然你可以写的详细点(比如拦截控制正异常,sql异常等等,,)

4.@Validated参数校验注解;

@Validated是spring下的一个注解,算是@Valid的一个升级版吧,原因:同一个参数它可以进行分组,比如在添加的时候进行校验,修改的时候不需要校验;

打个比方填写一个报表。很多内容是需要校验的才能提交的,虽然前端进行了校验,但是为了友好的做出安全措施,后端其实也是有必要进行校验的。下面我给出一些常用的字段注解;

  • @NotNull():不为空;
  • @NotEmpty():验证注解的元素值不为null且不为空(字符串长度不为0、集合大小不为0);
  • @NotBlank():验证注解的元素值不为空(不为null、去除首位空格后长度为0),不同于@NotEmpty,@NotBlank只应用于字符串且在比较时会去除字符串的空格
  • @Max():限制必须为一个不大于指定值的数字
  • @Min():限制必须为一个不小于指定值的数字
  • @Size(max,min)限制字符长度必须在min到max之间
  • @Email()验证email格式
  • @Pattern()限制必须符合指定的正则表达式   其中他们都有个message的参数,它的值为自定义错误信息,比如
public class User {
    @NotBlank(message="用户名不能为空")
    private String username;
}

这些做完后,在controller层,在接受对象前加上@Validated注解,就会进行字段校验,当然这些错误我们只需要进行获取其中的自己写的错误信息。

@PostMapping
public Result save(@Validated User user)throws Exception {
    UserService.save(user);
    return Result.SUCCESS;
}

这样的话进行校验的错误全部被统一异常处理拦截后(看上面的统一异常处理)进行解析返回给用户了;

5.java.util.concurrent.atomic.LongAdder

1.对于java开发中的计数,大多数用的是自增(count++),但是处于多线程并发的情况下,,自增计算的数目会少于实际数量(因为 ++ 线程是不安全的也就是说不是原则操作。他会经过读取,修改,写入单个步骤 )。 这个时候可以用(synchronized锁)就可以,当然使用LongAdder 类也可以避免这种情况。

public static void main(String[] args) {
    Integer [] list = {1,2,3,4,5,6,7,8,9,10};
    LongAdder count= new LongAdder();
    for (int i:list) {
        // 自增 
        count.increment();
        // 获取当前值
        count.sum();
    }
}

转载于:https://my.oschina.net/u/4037000/blog/3045358

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值