前提:参数多的情况下,避免在代码中出现多个if逻辑判断
首先定义一个统一结果返回类
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
/**
* @author administrator
* @description
* @date 2022/4/12 15:27
*/
@Data
public class ResultDTO<T> {
@ApiModelProperty(value = "标识true成功,false失败")
private boolean success;
@ApiModelProperty(value = "状态码")
private Integer code;
@ApiModelProperty(value = "提示信息")
private String msg;
@ApiModelProperty(value = "结果集")
private T data;
public ResultDTO() {
}
public ResultDTO(boolean success, Integer code, String msg, T data) {
this.success = success;
this.code = code;
this.msg = msg;
this.data = data;
}
public ResultDTO success() {
this.setSuccess(true);
this.setCode(200);
this.setMsg("成功");
return this;
}
public ResultDTO success(T data) {
this.setSuccess(true);
this.setCode(200);
this.setMsg("成功");
this.setData(data);
return this;
}
public ResultDTO fail(Integer code, String msg){
this.setSuccess(false);
this.setCode(code);
this.setMsg(msg);
return this;
}
}
实现DefaultGroupSequenceProvider 对具体实体类进行分组校验
import org.hibernate.validator.spi.group.DefaultGroupSequenceProvider;
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
/**
* @author administrator
* @description 分组校验处理器
* @date 2022/4/12 11:48
*/
public class TestGroupSequenceProvider implements DefaultGroupSequenceProvider<ParamCheck> {
@Override
public List<Class<?>> getValidationGroups(ParamCheck param) {
List<Class<?>> defaultGroupSequence = new ArrayList<>();
defaultGroupSequence.add(ParamCheck.class); // 这一步不能省,否则Default分组都不会执行了
if (param != null) { // 这块判空请务必要做
String type = param.getType(); // 获取要做判断的字段,可进行多个字段联合判断
if (Objects.equals("1", type)) {
defaultGroupSequence.add(ParamCheck.IsTypeOneGroup.class); // 把要做校验的分组加到defaultGroupSequence
} else if (Objects.equals("2", type)) {
defaultGroupSequence.add(ParamCheck.IsTypeTwoGroup.class);// 把要做校验的分组加到defaultGroupSequence
} else {
defaultGroupSequence.add(ParamCheck.IsTypeOneGroup.class);
defaultGroupSequence.add(ParamCheck.IsTypeTwoGroup.class);
}
}
return defaultGroupSequence;
}
}
接口传参接收的实体类
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import org.hibernate.validator.group.GroupSequenceProvider;
import javax.validation.constraints.NotEmpty;
import java.io.Serializable;
/**
* @author administrator
* @description
* @date 2022/4/12 14:06
*/
@GroupSequenceProvider(TestGroupSequenceProvider.class)
@Data
public class ParamCheck implements Serializable {
private static final long serialVersionUID = 7067185176646027041L;
@ApiModelProperty(value = "每次请求的唯一值", required = true, example = "123456")
@NotEmpty(message = "请求ID不能为空")
private String reqId;
@ApiModelProperty(value = "匹配类型:0-揽派地址(寄件收件信息都不能为空),1-揽收地址(寄件信息不能为空),2-派件地址(收件信息不能为空)", required = true, example = "0")
@NotEmpty(message = "匹配类型不能为空")
private String type;
@ApiModelProperty(value = "寄件省份")
@NotEmpty(message = "寄件省份不能为空", groups = IsTypeOneGroup.class)
private String sendProvince;
@ApiModelProperty(value = "寄件城市")
@NotEmpty(message = "寄件城市不能为空", groups = IsTypeOneGroup.class)
private String sendCity;
@ApiModelProperty(value = "收件省份")
@NotEmpty(message = "收件省份不能为空", groups = IsTypeTwoGroup.class)
private String acceptProvince;
@NotEmpty(message = "收件城市不能为空", groups = IsTypeTwoGroup.class)
@ApiModelProperty(value = "收件城市")
private String acceptCity;
public interface IsTypeOneGroup{};
public interface IsTypeTwoGroup{};
}
controller控制层定义具体接口,注意一定要按照以下顺序
@Valid @RequestBody ParamCheck param, BindingResult bindingResult
import io.swagger.annotations.ApiOperation;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.validation.BindingResult;
import javax.validation.Valid;
@ApiOperation(value = "测试校验参数接口")
@PostMapping("/basic/checkParams")
public ResultDTO checkParams(@Valid @RequestBody ParamCheck param, BindingResult bindingResult,
HttpServletRequest request) {
log.info("<<<<<测试校验参数接口{}>>>>>", JSON.toJSONString(param));
if(bindingResult.hasFieldErrors()) {
return new ResultDTO<>().fail(400, bindingResult.getFieldError().getDefaultMessage());
}
return new ResultDTO<>().success();
}