springboot~统一处理日期请求参数java.utils.Date和java.time.LocalDate
Posted 敢于对过去告一个段落,才有信心掀开新的篇章!
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了springboot~统一处理日期请求参数java.utils.Date和java.time.LocalDate相关的知识,希望对你有一定的参考价值。
日期类型的参数在从前端通过url参数传递到后端时,它会被进行格式化,如果格式化失败会出现400的错误,像日期格式默认会使用yyyy/MM/dd的格式,如果希望自己去个性化配置,我们可以通过实现WebMvcConfigurer接口的addFormatters方法来完成。
java.time.LocalDate统一处理
DateTimeFormatterRegistrar
实例的setTimeFormatter
,setDateFormatter
,setDateTimeFormatter
可以很方便的指定LocalDate这些类型的格式- 通过定义
DateFormatter
对象,可以声明java.util.Date类型的格式,但默认的,你只能定义一个java.util.Date对应的格式,多个的话,被会覆盖 - 通过实现
org.springframework.format.Formatter<Date>
接口,来定义多个java.util.Date对应的格式,它可以进行遍历,并进行最优的格式匹配
代码的实现
/**
* WebMvc配置.
* @author lind
* @date 2023/5/24 23:46
* @since 1.0.0
*/
@Configuration
public class WebMvcConfiguration implements WebMvcConfigurer
/**
* 增加GET请求参数中时间类型转换,注意是LocalTime,LocalDate和LocalDateTime,因为你配置的是DateTimeFormatter.
* <ul>
* <li>HH:mm:ss -> LocalTime</li>
* <li>yyyy-MM-dd -> LocalDate</li>
* <li>yyyy-MM-dd HH:mm:ss -> LocalDateTime</li>
* </ul>
* @param registry
*/
@Override
public void addFormatters(FormatterRegistry registry)
DateTimeFormatterRegistrar registrar = new DateTimeFormatterRegistrar();
// LocalDate,LocalTime,LocalDateTime格式化
registrar.setTimeFormatter(DatePattern.NORM_TIME_FORMATTER);
registrar.setDateFormatter(DatePattern.NORM_DATE_FORMATTER);
registrar.setDateTimeFormatter(DatePattern.NORM_DATETIME_FORMATTER);
registrar.registerFormatters(registry);
// java.util.Date日期格式化
registry.addFormatter(new CompositeFormatter());
/**
* java.util.Date日期格式化.
*/
private static class CompositeFormatter implements Formatter<Date>
private final List<Formatter<Date>> formatters = Arrays.asList(new DateFormatter("yyyy-MM-dd HH:mm:ss"),
new DateFormatter("yyyy-MM-dd"), new DateFormatter("HH:mm:ss"));
@Override
public Date parse(String text, Locale locale) throws ParseException
for (Formatter<Date> formatter : formatters)
try
return formatter.parse(text, locale);
catch (ParseException ignored)
throw new ParseException("Unable to parse date: " + text, 0);
@Override
public String print(Date date, Locale locale)
return formatters.get(0).print(date, locale);
测试代码与截图
- 代码
@GetMapping("print")
public ResponseEntity print(@RequestParam LocalDateTime date, @RequestParam Date simple)
Map<String, Object> result = new HashMap<>();
result.put("time", date);
result.put("simple", simple);
return ResponseEntity.ok(result);
- 调用和结果
springboot 实体参数校验 validate 抛出javax.validation.ConstraintViolationException异常 统一处理
@ControllerAdvice
public class WebExceptionHandler {
//处理Get请求中 使用@Valid 验证路径中请求实体校验失败后抛出的异常,详情继续往下看代码
@ExceptionHandler(BindException.class)
@ResponseBody
public Result BindExceptionHandler(BindException e) {
String message = e.getBindingResult().getAllErrors().stream().map(DefaultMessageSourceResolvable::getDefaultMessage).collect(Collectors.joining());
return Result.build(ResultCode.PARAM_ERROR.getCode(),message);
}
//处理请求参数格式错误 @RequestParam上validate失败后抛出的异常是javax.validation.ConstraintViolationException
@ExceptionHandler(ConstraintViolationException.class)
@ResponseBody
public Result ConstraintViolationExceptionHandler(ConstraintViolationException e) {
String message = e.getConstraintViolations().stream().map(ConstraintViolation::getMessage).collect(Collectors.joining());
return Result.build(ResultCode.PARAM_ERROR.getCode(),message);
}
//处理请求参数格式错误 @RequestBody上validate失败后抛出的异常是MethodArgumentNotValidException异常。
@ExceptionHandler(MethodArgumentNotValidException.class)
@ResponseBody
public Result MethodArgumentNotValidExceptionHandler(MethodArgumentNotValidException e) {
String message = e.getBindingResult().getAllErrors().stream().map(DefaultMessageSourceResolvable::getDefaultMessage).collect(Collectors.joining());
return Result.build(ResultCode.PARAM_ERROR.getCode(),message);
}
}
@Configuration
public class WebParamValidateConfig {
@Bean
public Validator validator() {
ValidatorFactory validatorFactory = Validation.byProvider(HibernateValidator.class)
.configure()
//failFast的意思只要出现校验失败的情况,就立即结束校验,不再进行后续的校验。
.failFast(true)
.buildValidatorFactory();
return validatorFactory.getValidator();
}
@Bean
public MethodValidationPostProcessor methodValidationPostProcessor() {
MethodValidationPostProcessor methodValidationPostProcessor = new MethodValidationPostProcessor();
methodValidationPostProcessor.setValidator(validator());
return methodValidationPostProcessor;
}
}
以上是关于springboot~统一处理日期请求参数java.utils.Date和java.time.LocalDate的主要内容,如果未能解决你的问题,请参考以下文章
SpringBoot2.0 使用AOP统一处理Web请求日志(完整版)