springboot 自带实体属性校验,可有的需要自定义业务场景
一、RangeConstraint
package cn.com.rdhl.common.utils.valid;
import javax.validation.Constraint;
import javax.validation.Payload;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/**
* @description: 1
* @author: HuangZheng
* @create: 2021/6/10
**/
@Target({ElementType.METHOD, ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
@Constraint(validatedBy = RangeConstraintValidator.class)
public @interface RangeConstraint {
String message();
String rangeType();
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};
}
二、 RangeConstraintValidator
package cn.com.rdhl.common.utils.valid;
import cn.com.rdhl.common.utils.RpDictDataUtil;
import org.apache.commons.lang3.StringUtils;
import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;
/**
* @description: 1
* @author: HuangZheng
* @create: 2021/6/10
**/
public class RangeConstraintValidator implements ConstraintValidator<RangeConstraint, String> {
private String rangeType;
@Override
public void initialize(RangeConstraint constraintAnnotation) {
this.rangeType = constraintAnnotation.rangeType();
System.out.println("my validator init");
}
@Override
public boolean isValid(String value, ConstraintValidatorContext context) {
// 不做非空校验
if (StringUtils.isBlank(value)) {
return true;
}
final String nameByCode = RpDictDataUtil.getNameByCode(rangeType, value);
if (StringUtils.isNotBlank(nameByCode)) {
return true;
}
return false;
}
}
三、控制层业务开始的地方
需要在参数上添加 @Valid注解,异常信息是在BindingResult 中 详细代码如下
@GetMapping("/mediList")
@ApiOperation(value = "药品字典查询(HSF)", response = MediOutputApi.class, notes = "")
@ResponseBody
public Message mediList(@Valid MedicInputApi queryParam, BindingResult bindingResult) {
Map<String, Object> para = new HashMap<String, Object>();
para.put("drugType", queryParam.getDrugType());
para.put("drugName", queryParam.getDrugName());
para.put("operTime", queryParam.getOperTime());
PageHelper.startPage(queryParam.getPageNum(), queryParam.getPageSize());
List<DrugHsOutputApi> list = mediService.selectAll(para);
return BindingResultUtil.message(bindingResult, getDataTable(list));
}
对应的实体,普通注解和自定义注解都有@RangeConstraint
package cn.com.rdhl.project.masterData.api.domain;
import cn.com.rdhl.common.utils.valid.RangeConstraint;
import cn.com.rdhl.project.api.common.domain.PlatApiPageParam;
import io.swagger.annotations.ApiModelProperty;
import lombok.Getter;
import lombok.Setter;
import lombok.ToString;
import javax.validation.constraints.NotBlank;
/**
* @vision V1.0
*/
@Getter
@Setter
@ToString
public class MedicInputApi extends PlatApiPageParam {
@NotBlank(message = "drugType不能为空")
@ApiModelProperty(value = "药品基本分类 )
private String drugType;
@ApiModelProperty(value = "药品名称")
private String drugName;
@RangeConstraint(rangeType = "sys_user_sex", message = "性别值域不对")
@ApiModelProperty(value = "性别")
private String sex;
@ApiModelProperty(value = "最后更新时间(yyyy-MM-dd hh24:mi:ss)")
private String operTime;
}
异常处理的方法
package cn.com.rdhl.common.utils.valid;
import cn.com.rdhl.common.web.domain.Message;
import cn.com.rdhl.common.web.page.TableDataInfo;
import cn.hutool.core.util.StrUtil;
import org.springframework.validation.BindingResult;
import org.springframework.validation.ObjectError;
import java.util.ArrayList;
import java.util.List;
/**
* @description: 1
* @author: HuangZheng
* @create: 2021/6/10
**/
public class BindingResultUtil {
/**
* 返回带分页的数据
*
* @param bindingResult
* @param tableDataInfo
* @return
*/
public static Message message(BindingResult bindingResult, TableDataInfo tableDataInfo) {
List<String> list = new ArrayList<>();
if (bindingResult.hasErrors()) {
for (ObjectError error : bindingResult.getAllErrors()) {
list.add(StrUtil.format("错误信息为:【{}】", error.getDefaultMessage()));
}
return Message.error(1, "失败", list);
}
return Message.success("成功", tableDataInfo);
}
/**
* 返回数据
*
* @param bindingResult
* @param list
* @return
*/
public static Message message(BindingResult bindingResult, List<Object> list) {
List<String> resultList = new ArrayList<>();
if (bindingResult.hasErrors()) {
for (ObjectError error : bindingResult.getAllErrors()) {
resultList.add(StrUtil.format("错误信息为:【{}】", error.getDefaultMessage()));
}
return Message.error(1, "失败", resultList);
}
return Message.success("成功", list);
}
}