springboot在业务层校验对象参数是否必填
- 1.场景说明
- 2.代码实现
1.场景说明
为什么不在控制层使用@Validated或者@Valid注解直接进行校验呢?例如通过excel导入数据,将excel数据转为实体类集合后,校验集合中属性是否符合要求。
2.代码实现
- 定义对象以及参数校验
@Data
public class IdentityDTO {
/**
* 标识值索引
*/
@NotNull(message = "index不能为空")
private Integer index;
/**
* 标识值类型
*/
@NotBlank(message = "type不能为空")
@Size(max = 32, message = "type长度不能超过{max}个字符")
private String type;
}
- 添加字段校验工具类
import javax.validation.ConstraintViolation;
import javax.validation.Validation;
import javax.validation.Validator;
import java.util.List;
import java.util.Set;
public class ValidationUtils {
private static final Validator validator = Validation.buildDefaultValidatorFactory().getValidator();
/**
* 校验对象或集合,并返回第一个校验不通过的字段的错误信息。
* 如果所有字段校验通过,则返回 null。
*
* @param obj 需要校验的对象或集合
* @return 返回第一个校验不通过的字段的错误信息,如果所有字段校验通过,则返回 null。
*/
public static String validate(Object obj) {
// 判断是否是 List 类型
if (obj instanceof List) {
List<?> list = (List<?>) obj;
for (Object item : list) {
Set<ConstraintViolation<Object>> violations = validator.validate(item);
if (!violations.isEmpty()) {
// 返回第一个校验不通过的字段的错误信息
return violations.iterator().next().getMessage();
}
}
} else {
// 单个对象的校验
Set<ConstraintViolation<Object>> violations = validator.validate(obj);
if (!violations.isEmpty()) {
// 返回第一个校验不通过的字段的错误信息
return violations.iterator().next().getMessage();
}
}
// 如果所有字段校验通过,返回 null
return null;
}
}
- 业务层代码实现
@Override
public R test(String data) {
JSONObject jsonObject = JSON.parseObject(data);
String suffix = jsonObject.getString("suffix");
JSONArray jsonArray = jsonObject.getJSONArray("list");
List<IdentityDTO> list = JSON.parseArray(jsonArray.toJSONString(), IdentityDTO.class);
//参数校验
String validationResult = ValidationUtils.validate(list);
if (validationResult != null){
return R.fail("操作失败",validationResult);
}
return R.ok();
}
- 示例