简化验空小技巧

简化原因:
  我们在做业务的时候,经常需要对入参需要进行一系列的验空,就算前端已经对他们进行了非空判断,处于安全考虑,在后端还是需要进行验空操作。
  特别是现在微服务框架特别火,并且很多leader喜欢用mongodb作为数据库来存储。一个入参甚至可能包括七八个嵌套对象列表的验参,简直惨无人道,还不能出一点错。
  当然这对于简单的对象验证来说就是简化代码格式,整洁代码。

  如下图,验证类挺多的,在这里插入图片描述

简化方法:使用@Valid跟@NotBlank注解

1.Controller类如下:

package com.baozun.chenda.controller;

import com.baozun.chenda.manager.InvoiceManager;
import com.baozun.chenda.model.Invoice;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.annotation.*;

import javax.validation.Valid;

@RestController
@RequestMapping("/chen")
public class HelloController {
    @Autowired
    private InvoiceManager invoiceManager;

    @PostMapping("/validate")
    public String authorize(@RequestBody @Valid Invoice invoice, BindingResult ret){
        invoiceManager.validateParam(invoice, ret);
        return "kkk";
    }
}

2.manager类

package com.baozun.chenda.manager;

import com.baozun.chenda.model.Invoice;
import org.springframework.validation.BindingResult;

/**
 * @Author chenshuai
 * @data 2019/1/25 15:02
 */
public interface InvoiceManager {
    void validateParam(Invoice invoice, BindingResult ret);
}

3.manager实现类

package com.baozun.chenda.manager;

import com.baozun.chenda.model.Invoice;
import org.springframework.stereotype.Service;
import org.springframework.util.Assert;
import org.springframework.validation.BindingResult;
import org.springframework.validation.FieldError;

import java.util.List;

/**
 * @Author chenshuai
 * @data 2019/1/25 15:15
 */
@Service("invoiceManager")
public class InvoiceManagerImpl implements InvoiceManager {
    @Override
    public void validateParam(Invoice invoice, BindingResult ret) {
        if (ret.hasFieldErrors()) {
            List<FieldError> errorList = ret.getFieldErrors();
            //通过断言抛出参数不合法的异常
            errorList.stream().forEach(item -> Assert.isTrue(false,item.getDefaultMessage()));
        }
    }
}

4.model类

import javax.validation.constraints.NotBlank;
import java.io.Serializable;

/**
 * @Author chenshuai
 * @data 2019/1/25 13:53
 */
@Getter
@Setter
public class Invoice implements Serializable {
    @NotBlank(message = "系统编码为空")
    private String systenCode;
    @NotBlank(message = "平台编码为空")
    private String platformCode;
    @NotBlank(message = "订单流水号为空")
    private String serioNo;
}

使用postman测试,确实如此。
优点:简化代码,
缺点:只要验证入参,接口方法带了BindingResult ret这个多余的参数

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值