springboot~对@RequestParam中Date参数的适配
@RequestParam中的Date类型的参数,如果前端给⼀个2001-01-01在后端默认是不认的,我们在后端需要对这种情况进⾏适配,我们可以通过
@ControllerAdvice注解来拦截请求,然后对Date参数进⾏转换,最终实现我们的需求。
实现verter.Convert接⼝,来完成⽇期格式的转换
public class CourseDateConverter implements Converter<String, Date> {
private static final String dateFormat = "yyyy-MM-dd HH:mm:ss";
private static final String dateFormata = "yyyy-MM-dd HH:mm:ss";
private static final String shortDateFormat = "yyyy-MM-dd";
private static final String shortDateFormata = "yyyy/MM/dd";
private static final String timeStampFormat = "^\\d+$";
@Override
public Date convert(String value) {
if (StringUtils.isEmpty(value)) {
return null;
}
value = im();
try {
if (ains("-")) {
SimpleDateFormat formatter;
if (ains(":")) {
// yyyy-MM-dd HH:mm:ss 格式
formatter = new SimpleDateFormat(dateFormat);
} else {
// yyyy-MM-dd 格式
formatter = new SimpleDateFormat(shortDateFormat);
}
return formatter.parse(value);
} else if (value.matches(timeStampFormat)) {
//时间戳
Long lDate = new Long(value);
return new Date(lDate);
} else if (ains("/")) {
SimpleDateFormat formatter;
if (ains(":")) {
// yyyy/MM/dd HH:mm:ss 格式
formatter = new SimpleDateFormat(dateFormata);
} else {
// yyyy/MM/dd 格式
formatter = new SimpleDateFormat(shortDateFormata);
}
return formatter.parse(value);
}
} catch (Exception e) {
throw new RuntimeException(String.format("parser %s to Date fail", value));
}
throw new RuntimeException(String.format("parser %s to Date fail", value));
}
}
通过@InitBinder来注⼊转换器 @InitBinder作⽤于@Controller中的⽅法,表⽰为当前控制器注册⼀个属性编辑器,对WebDataBinder进⾏初始化,且只对当前的Controller有效。
@InitBinder执⾏时机 @InitBinder注解被解析的时机,是其所标注的⽅法,在该⽅法被请求执⾏之前。同时@InitBinder标注的⽅法是可以多次执⾏的,也就是说来⼀次请求就执⾏⼀次@InitBinder解析。
@InitBinder执⾏原理当某个Controller上的第⼀次请求,由SpringMVC前端控制器匹配到该Controller之后,根据Controller的 class 类型来查所有标注了
@InitBinder注解的⽅法,并且存⼊RequestMappingHandlerAdapter⾥的 initBinderCache 缓存中。等下⼀次请求执⾏对应业务⽅法之前,会先⾛initBinderCache缓存,⽽不⽤再去解析@InitBinder。
@ControllerAdvice
public class TimeControllerHandler {
@InitBinder
spring framework网络系统参数public void initBinder(WebDataBinder binder) {
GenericConversionService genericConversionService = (GenericConversionService) ConversionService();
if (genericConversionService != null) {
genericConversionService.addConverter(new CourseDateConverter());
}
}
}
这样,前端传⼊的⽇期参数?fromDate=2001-01-01&endDate=2015-01-01,也是可以被后端成功处理的。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。