目录
这一篇主要说的是,使用SpringBoot里面自带的一些参数校验插件,只要使用功能SpringBoot,基本是web或者微服务的功能,部署到服务器上,基本上都是做业务操作的,结案是业务操作,那就是有一定的,需要参数格式化校验以及规范化处理。
主要参数校验主要有以下几个方法的。这些是一些基本的参数,如果要是使用其他的参数还是需要自定义实现类的。
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
dataList = exportDataService.packageDataList(date); - // 过滤00:00:00-07:00:00
- List
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();
- }
- }
