本文主要是介绍SpringMVC处理表单日期数据转换异常(Date)使用@InitBinder,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
1:@ControllerAdvice注解添加一个类:
package cn.temptation.web;import org.springframework.beans.propertyeditors.CustomDateEditor; import org.springframework.web.bind.WebDataBinder; import org.springframework.web.bind.annotation.ControllerAdvice; import org.springframework.web.bind.annotation.InitBinder;import java.text.SimpleDateFormat; import java.util.Date;/** * @Author:Starry * @Description:处理表单数据转换对象异常(Date) * @Date:Created in 14:45 2018/3/15 * Modified By: */ @ControllerAdvice public class AppControllerAdvice {@InitBinder public void initBinder(WebDataBinder binder){/*以下方法二选一,第一个无需添加MulitFormatDateEditor这个类*/ //方法1:支持一个日期格式 binder.registerCustomEditor(Date.class,new CustomDateEditor(new SimpleDateFormat("yyyy-MM-dd"),true)); //方法2:支持两个日期格式 //true 允许属性为空verficationController binder.registerCustomEditor(Date.class,new MulitFormatDateEditor(new SimpleDateFormat("yyyy-MM-dd"),new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"),true));}
}
2:创建一个继承自PropertyEditorSupport的类MulitFormatDateEditor
package cn.temptation.web;import org.springframework.util.StringUtils;import java.beans.PropertyEditorSupport; import java.text.DateFormat; import java.text.ParseException; import java.util.Date;/** * @Author:Starry * @Description:支持两个日期格式的转换,springmvc自带的转换器仅支持一种格式 * @Description:日期转换为String时默认使用dateFormat2格式 * @Date:Created in 14:49 2018/3/15 * Modified By: */ public class MulitFormatDateEditor extends PropertyEditorSupport{//日期格式1 private final DateFormat dateFormat;//日期格式2 private final DateFormat dateFormat2;//是否允许为空 private final boolean allowEmpty;//日期长度 private final int exactDateLength;public MulitFormatDateEditor(DateFormat dateFormat, DateFormat dateFormat2, boolean allowEmpty) {this.dateFormat = dateFormat;this.dateFormat2 = dateFormat2;this.allowEmpty = allowEmpty;this.exactDateLength = -1;}public MulitFormatDateEditor(DateFormat dateFormat, DateFormat dateFormat2, boolean allowEmpty, int exactDateLength) {this.dateFormat = dateFormat;this.dateFormat2 = dateFormat2;this.allowEmpty = allowEmpty;this.exactDateLength = exactDateLength;}/* * 使用指定的日期格式,解析给定文本的日期。 * */ @Override public void setAsText(String text) throws IllegalArgumentException {if(this.allowEmpty && StringUtils.hasText(text)){setValue(null);}else if(text != null && this.exactDateLength >= 0 && text.length() != this.exactDateLength){throw new IllegalArgumentException("不能解析这个日期,长度为:"+this.exactDateLength);}else{try {if(text != null){setValue(this.dateFormat.parse(text));}}catch (ParseException ex){try {if(text != null){setValue(this.dateFormat2.parse(text));}}catch (ParseException ex2){throw new IllegalArgumentException("不能解析这个日期"+ex.getMessage(),ex);}}}}/** * 将日期格式化为字符串,使用指定的日期格式。 */ @Override public String getAsText() {Date value = (Date)getValue();return (value != null ? this.dateFormat2.format(value):"");}}
3:然后就可以了,每天进步一点点 Starry❤
这篇关于SpringMVC处理表单日期数据转换异常(Date)使用@InitBinder的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!