简化原因:
我们在做业务的时候,经常需要对入参需要进行一系列的验空,就算前端已经对他们进行了非空判断,处于安全考虑,在后端还是需要进行验空操作。
特别是现在微服务框架特别火,并且很多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这个多余的参数