目录
前言
这一篇主要说的是,使用SpringBoot里面自带的一些参数校验插件,只要使用功能SpringBoot,基本是web或者微服务的功能,部署到服务器上,基本上都是做业务操作的,结案是业务操作,那就是有一定的,需要参数格式化校验以及规范化处理。
主要参数校验主要有以下几个方法的。这些是一些基本的参数,如果要是使用其他的参数还是需要自定义实现类的。
SpringBoot自带的校验规则
实现案例关键性代码
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
import javax.validation.Valid;
@RequestMapping(value = "/handleZeroRate", method = RequestMethod.GET)
@ApiOperation(value = "90天内的定时任务")
public ApiResponse handleZeroRate(@Valid String handleStr, BindingResult bindingResult) {
ApiResponse response = ApiResponseBuilder.newSuccessResponse();
try {
if(bindingResult.hasErrors()){
Map map = new HashMap(2);
map.put("定时任务参数入参不合法:",handleStr);
response.setData((JSONObject) JSONObject.toJSON(map));
return response;
}
filterPushTimeTaskFacade.performTasks();
Map map = new HashMap(2);
map.put("运行结果完成", "定时任务成功完成");
response.setData((JSONObject) JSONObject.toJSON(map));
} catch (Exception ex) {
return ApiResponseBuilder.newErrorResponse(ex);
}
return response;
}
校验规则
主要是不需要判断是否是空了,一个简单地校验规则,复杂的话,需要自己实现一下了
业务上使用功能的校验规则仅仅针对特定业务场景
关键性代码块如下。此处是使用工具类来进行校验输入的日期格式化是否正常合法的。
if (DateParseUtils.invalid(date, DateUtils.FORMAT_PATTERN_YYYY_MM_DD)) {
ResponseBuilder.errorRes(response, WebCodeEnum.ERROR_DATE_PARAM);
return;
}
@GetMapping("/target")
public void target(String date, HttpServletResponse response) throws IOException {
if (DateParseUtils.invalid(date, DateUtils.FORMAT_PATTERN_YYYY_MM_DD)) {
ResponseBuilder.errorRes(response, WebCodeEnum.ERROR_DATE_PARAM);
return;
}
List<TimeTargetData> dataList = exportDataService.packageDataList(date);
// 过滤00:00:00-07:00:00
List<TimeTargetData> resultList = dataList.stream().filter(data -> data.getOrder() != 1).collect(Collectors.toList());;
try {
response.setContentType("application/vnd.ms-excel");
response.setCharacterEncoding("utf-8");
String fileName = URLEncoder.encode("中台舆情生产观察指标-" + date, "UTF-8");
response.setHeader("Content-disposition", "attachment;filename=" + fileName + ".xlsx");
// 这里需要设置不关闭流
EasyExcel.write(response.getOutputStream(), TimeTargetData.class).autoCloseStream(Boolean.FALSE).sheet(date + "指标数据").doWrite(resultList);
} catch (Exception e) {
ResponseBuilder.errorRes(response, WebCodeEnum.ERROR, e.getMessage());
}
}
工具类的校验代码如下
业务上经常使用的是工具类来替换这个校验规则,主要是针对日期或者字符串以及对象啥的进行一层层判断。其实并不太好维护,因为规则可能不断叠加的。这么多的ifelse要写到什么时候呢?
@Slf4j
public class DateParseUtils extends DateUtils {
/**
* 判断日期字符串格式是否符合格式化要求
* @param dateStr 日期字符串
* @param format 格式化方式
* @return true-符合,false-不符合
*/
public static boolean valid(String dateStr, String format) {
if (StringUtils.isBlank(dateStr)) {
return false;
}
try {
return parseDate(dateStr, format) != null;
} catch (Exception e) {
log.error("错误的日期格式:{},格式化方式为:{}", dateStr, format);
return false;
}
}
/**
* 判断日期字符串格式是否不符合格式化要求
* @param dateStr 日期字符串
* @param format 格式化方式
* @return true-不符合,false-符合
*/
public static boolean invalid(String dateStr, String format) {
return !valid(dateStr, format);
}
/**
* 按日期格式解析日期字符串
* @param dateStr 日期字符串
* @param format 日期格式
* @return {@code LocalDate}
*/
public static LocalDate parseDate(String dateStr, String format) {
DateTimeFormatter formatter = DateTimeFormatter.ofPattern(format);
return LocalDate.parse(dateStr, formatter);
}
/**
* 按日期时间格式解析日期字符串
* @param dateTimeStr 日期时间字符串
* @param format 日期格式
* @return {@code Instant}
*/
public static Instant parseDateTime(String dateTimeStr, String format) {
DateTimeFormatter formatter = DateTimeFormatter.ofPattern(format);
return LocalDateTime.parse(dateTimeStr, formatter).atZone(ZoneId.systemDefault()).toInstant();
}
/**
* 按日期格式解析日期字符串
* @param dateStr 日期时间字符串
* @param format 日期格式
* @return {@code Date}
*/
public static Date parseDateStr(String dateStr, String format) {
return Date.from(parseDateTime(dateStr, format));
}
/**
* 根据时间戳转换成日期格式
* @param timestamp 时间戳
* @return 日期
*/
public static Date parseTimestamp(Long timestamp) {
if (timestamp == null) {
return null;
}
if (timestamp < 9999999999L) {
return new Date(timestamp * 1000);
}
return new Date(timestamp);
}
/**
* 按日期格式解析日期字符串
* @param dateStr 日期字符串
* @param timeStr 时间字符串
* @param format 日期格式
* @return {@code Date}
*/
public static Date parseDateTimeStr(String dateStr, String timeStr, String format) {
if (StringUtils.isBlank(dateStr)) {
return null;
}
if (StringUtils.isBlank(timeStr.trim())) {
timeStr = "00:00:00";
}
return Date.from(parseDateTime(dateStr.split(" ")[0] + StringUtils.SPACE + timeStr.trim(), format));
}
/**
* 解析日期字符串
* @param dateStr 日期字符串
* @return {@code Date}
*/
public static Date parseDateStr(String dateStr) {
if (StringUtils.isBlank(dateStr)) {
return null;
}
if (dateStr.length() == FORMAT_PATTERN_DEFAULT.length()) {
return parseDateStr(dateStr, FORMAT_PATTERN_DEFAULT);
} else if (dateStr.length() == FORMAT_PATTERN_YYYY_MM_DD.length()) {
return parseDateStr(dateStr + " 00:00:00", FORMAT_PATTERN_DEFAULT);
}
return null;
}
/**
* 解析日期时间字符串
* @param dateStr 日期字符串
* @param timeStr 时间字符串
* @return {@code Date}
*/
public static Date parseDateTimeStr(String dateStr, String timeStr) {
if (StringUtils.isBlank(timeStr)) {
return parseDateStr(dateStr);
} else {
return parseDateStr(dateStr + StringUtils.SPACE + timeStr);
}
}
/**
* 返回指定日期最大时间值
* @param dateStr 指定日期
* @return 指定日期最大时间值
*/
public static LocalDateTime atEndOfDay(String dateStr) {
return atEndOfDay(dateStr, FORMAT_PATTERN_YYYY_MM_DD);
}
/**
* 返回指定日期最小时间值
* @param dateStr 指定日期
* @return 指定日期最小时间值
*/
public static LocalDateTime atStartOfDay(String dateStr) {
return atStartOfDay(dateStr, FORMAT_PATTERN_YYYY_MM_DD);
}
/**
* 返回指定日期最大时间值
* @param dateStr 指定日期
* @param format 格式化类型
* @return 指定日期最大时间值
*/
public static LocalDateTime atEndOfDay(String dateStr, String format) {
return parseDate(dateStr, format).atStartOfDay().with(LocalTime.MAX);
}
/**
* 返回指定日期最小时间值
* @param dateStr 指定日期
* @param format 格式化类型
* @return 指定日期最小时间值
*/
public static LocalDateTime atStartOfDay(String dateStr, String format) {
return parseDate(dateStr, format).atStartOfDay();
}
}