目录
一、 HTTP/HTTPS接口
1. 在controller上声明需要对数据进行校验
2. 然后在bean上声明需要被校验的字段
3. 处理异常
二、RPC接口参数判空
1、com.google.common.base.Verify
2、入参Query中写validate方法
一、 HTTP/HTTPS接口
对于这种前端请求,现在参数校验的方法极其多,比较省事的就是使用spring-boot的@Validated注解来校验,如果数据异常则会统一抛出异常,方便异常中心统一处理。比如我们判断一个输入参数是否合法,可以用如下方式。
1. 在controller上声明需要对数据进行校验
@PostMapping("/addDelivery")
public MlcBaseResult<Boolean> addDelivery(@RequestBody @Validated DeliveryInfo deliveryInfo) {
return deliveryService.addDelivery(deliveryInfo);
}
2. 然后在bean上声明需要被校验的字段
@ToString
@Setter
@Getter
public class DeliveryInfo extends ResourceBaseHsfQuery {
/**
* 配资源编码 -- 不可修改
*/
@NotNull(message = "配资源编码不能为空")
@NotBlank(message = "配资源编码不能为空")
@Pattern(regexp = "^\\s*|[0-9A-Za-z]*$", message = "配资源编码为数字和字母组合")
private String deliveryCode;
/**
* 配资源名称
*/
@NotNull(message = "配资源名称不能为空")
@NotBlank(message = "配资源名称不能为空")
@Pattern(regexp = "^[\\u0391-\\uFFE5\\w]+$", message = "配资源名称不能含有特殊字符")
private String deliveryName;
}
3. 处理异常
当输入的不能满足条件时,就是抛出异常,而后统一由异常中心处理,我采用的方式是,写了一个使用@RestControllerAdvice写了一个全局异常类去全局捕获spring mvc抛的异常,然后用ExceptionHandler捕获指定的MethodArgumentNotValidException异常以及MissingServletRequestParameterException异常结合BindingResult进行处理,这里要注意,get请求和post请求要分别处理。
@RestControllerAdvice
public class GlobalExceptionHandler {
/**
* 处理GET请求 单个参数校验 @RequestParam("code")
*/
@ExceptionHandler(MissingServletRequestParameterException.class)
public MlcBaseResult<String> handleMethodArgumentNotValidException2(MissingServletRequestParameterException e) {
MlcBaseResult<String> result = new MlcBaseResult<>();
result.setSuccess(false);
result.setErrorMessage(e.getMessage());
return result;
}
/**
* 处理参数校验
*/
@ExceptionHandler(MethodArgumentNotValidException.class)
@ResponseStatus(HttpStatus.OK)
public MlcBaseResult<String> handleMethodArgumentNotValidException2(HttpServletRequest request, MethodArgumentNotValidException e) {
MlcBaseResult<String> result = new MlcBaseResult<>();
result.setSuccess(false);
result.setErrorMessage(e.getBindingResult().getFieldError().getDefaultMessage());
return result;
}
}
二、RPC接口参数判空
1、com.google.common.base.Verify
如果是RPC接口就不能用上面那种处理方式了。这里其实我也没有找到更好的办法,暂时用的是Verify即com.google.common.base.Verify工具类。
@Transactional(rollbackFor = Exception.class)
public DataResult<Long> addDelivery(DeliveryInfoDTO deliveryInfoDTO) {
Verify.verifyNotNull(deliveryInfoDTO,"入参[%s]不能为空","DeliveryInfoDTO");
Verify.verifyNotNull(deliveryInfoDTO.getTenantCode(),"入参[%s]不能为空","tenantCode");
Verify.verifyNotNull(deliveryInfoDTO.getConsumerCode(),"入参[%s]不能为空","consumerCode");
Verify.verifyNotNull(deliveryInfoDTO.getDeliveryCode(),"入参[%s]不能为空","deliveryCode");
log.info("hsf.provider.DeliveryInfoServiceImpl.addDelivery | deliveryInfoDTO:" + deliveryInfoDTO.toString());
return DataResult.success();
}
2、入参Query中写validate方法
code review的时候新学的一招,把普适性的常用参数校验直接写到入参类里去,需要的时候直接调用即可
入参类
public class ResourceBaseQuery implements Serializable {
private static final long serialVersionUID = 2834947822273653346L;
/**
* 如果是服务商,那就是服务商的merchantCode
* 如果是商家,那就是商家的MerchantCode
*/
private String merchantCode;
public String getMerchantCode() {
return merchantCode;
}
public void setMerchantCode(String merchantCode) {
this.merchantCode = merchantCode;
}
public void checkMerchantCodeNotNull(){
if (StringUtils.isBlank(this.merchantCode)) {
throw new ResourceBizException(ErrorCodeEnum.ERROR_SYS_PARAM_ERROR.getCode(), "merchantCode不能为空!");
}
}
}
|