CustomDateEditor,WebBindingInitializer

本文介绍了如何在SpringMVC中使用自定义编辑器和初始化器实现Date类型的表单验证,并提供了修改错误提示信息的方法,解决用户输入非日期格式字符串时的显示问题。
请问我使用了Spring MVC表单验证Date类型,已经在继承了SimpleFormController的自己的Controller里的initBinder()写好:
DateFormat fmt = new SimpleDateFormat("yyyy-MM-dd");
CustomDateEditor dateEditor = new CustomDateEditor(fmt, true);
binder.registerCustomEditor(Date.class, dateEditor);
数据绑定没有问题,但是客户提交数据时,输入字母或者非yyyy-MM-dd格式的字符串,比如输入dd,
<form:errors path="time" cssClass="error"/>处输出错误:
Failed to convert property value of type [java.lang.String] to required type [java.util.Date] for property time; nested exception is java.lang.IllegalArgumentException: Could not parse date: Unparseable date: "dd"

问题是,如何才能将这样的错误信息变成自己想要的字符提示.本人已经试过在Validator里验证,判断当为fieldError时error.rejectValue(),但发现我想要的错误提示却跟在先前的IllegalArgumentException提示的后面一起弹出,极度郁闷!

public class MyBindingInitializer implements WebBindingInitializer {

public void initBinder(WebDataBinder binder, WebRequest request) {
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd"); //可以設定任意的日期格式
dateFormat.setLenient(false);
binder.registerCustomEditor(Date.class,
new CustomDateEditor(dateFormat, true));
binder.registerCustomEditor(String.class, new StringTrimmerEditor(false));
}
}
<!-- property editor -->
<bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">
<property name="webBindingInitializer">
<bean class="com.morris.MyBindingInitializer"/>
</property>
</bean>

/**
* 注册java.util.Date类型
*
* @param binder
*/
@InitBinder
public void initBinder(WebDataBinder binder) {
DateFormat dateFormat = new SimpleDateFormat(AppDateUtils.yyyyMMdd);
binder.registerCustomEditor(java.util.Date.class, new CustomDateEditor(dateFormat, true));
}
Spring框架中,当出现 `CustomDateEditor` 类文件版本错误(如提示 `class file has wrong version 61.0 should be 55.0`)时,这通常意味着当前运行环境的JDK版本与编译或运行该类时所使用的JDK版本不兼容。Java类文件版本号是Java编译器为每个类文件生成的标识,版本61.0对应JDK 17,而版本55.0对应JDK 11。 此类错误的根本原因包括: - 项目中某个依赖库是由JDK 17编译生成的,但当前构建或运行环境使用的是JDK 11。 - 项目中存在多个Spring版本,其中某些版本的Spring库是使用较高版本的JDK编译的。 ### 解决方案 #### 1. 统一JDK版本 确保整个项目及其依赖库都使用相同版本的JDK进行编译和运行。如果目标运行环境是JDK 11,则应使用JDK 11重新编译所有依赖库,并确保所有Spring依赖的版本兼容JDK 11。例如,Spring Framework 5.3.x 是支持JDK 11的最后一个版本系列。 ```xml <!-- 示例:在pom.xml中指定Spring Boot版本 --> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.7.12</version> <!-- 支持JDK 11 的Spring Boot版本 --> <relativePath/> <!-- lookup parent from repository --> </parent> ``` #### 2. 检查并更新依赖库 检查 `pom.xml` 或 `build.gradle` 文件,确认所有依赖项是否与当前JDK版本兼容。可以使用Maven命令 `mvn dependency:tree` 来查看项目的依赖树,并确认是否有依赖项使用了与当前JDK不兼容的Spring版本。如有必要,更新这些依赖项至兼容版本。 #### 3. 使用兼容性工具 若无法立即更新所有依赖库或统一JDK版本,可考虑使用工具如 `retrolambda` 或 `animal-sniffer` 来确保新版本编译的代码能在旧版本JDK上运行。 #### 4. 禁用或替换冲突类 如果问题仅出现在 `CustomDateEditor` 类上,可以尝试排除Spring中对该类的默认使用,并提供自定义实现。例如,在配置中注册自定义的 `PropertyEditorRegistrar` 来替代默认行为。 ```java @Configuration public class WebConfig implements WebMvcConfigurer { @Override public void addFormatters(FormatterRegistry registry) { registry.addCustomFormatter(new DateFormatter()); } } ``` #### 5. 使用JDK 17作为统一开发环境 如果条件允许,建议将整个开发和运行环境升级至JDK 17,以避免此类版本冲突问题,并享受新版本JDK带来的性能优化和功能增强。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值