spring mvc @InitBinder

本文介绍了解决SpringMVC中日期类型从JSON格式转换为Java Date类型的问题,通过使用@InitBinder注解注册自定义编辑器实现。该方法能够避免因类型不匹配导致的异常。
spring mvc 从前台往后台传值时,由于前台有时间控件,将时间类型传到后台时,像“yyyy-mm-dd”这样的日期格式spring不能自动进行转换,需要我们对日期类型进行转换后,后台才能处理,否则通常会抛出类型不匹配的异常 就是不能将string类型转成date类型,string类型是因为在前台传值时会把表单的值都转成json串的形式,而后台接收时,javabean里的属性类型是DATE的,故而转换错误了。

遇到这个问题可以像这样解决(以下代码可以直接拿过来用):

 @InitBinder
    public void initBinder(WebDataBinder binder)
    {
        binder.registerCustomEditor(Date.class, new CustomDateEditor(new SimpleDateFormat("yyyy-MM-dd"), false));
       
        binder.registerCustomEditor(int.class, new PropertyEditorSupport()
        {
           
            @Override
            public String getAsText()
            {
                // TODO Auto-generated method stub
                return getValue().toString();
            }
           
            @Override
            public void setAsText(String text)
                throws IllegalArgumentException
            {
                // TODO Auto-generated method stub
                System.out.println(text + "...........................................");
                setValue(Integer.parseInt(text));
            }
           
        });
    }



上面这个方法会在调用请求的方法之前去调用,进行了一次类型的转换,转换后在调用正常的请求方法,就不会抛出异常了。上面的方法参数可以有2个











### @InitBinder 注解的作用 `@InitBinder` 是 Spring MVC 提供的一个注解,用于在请求处理之前初始化 `WebDataBinder` 对象。通过该注解标记的方法可以自定义数据绑定逻辑,例如注册属性编辑器(PropertyEditor),以支持特定类型的转换或格式化操作。这在处理复杂类型如日期、枚举等时非常有用,因为默认的数据绑定机制可能无法直接处理这些类型 [^4]。 ### 使用场景 在实际开发中,当需要将 HTTP 请求参数自动绑定到控制器方法的参数上时,默认情况下,Spring MVC 会使用内置的 `DataBinder` 来完成这一任务。然而,在某些情况下,开发者可能希望对绑定过程进行定制,比如: - 将字符串转换为 `Date` 类型。 - 忽略某些字段,防止其被绑定。 - 自定义验证规则。 - 添加自定义的 `PropertyEditor` 或 `Converter`。 在这种情况下,`@InitBinder` 提供了灵活的方式来实现上述需求。 ### 示例代码 以下是一个典型的 `@InitBinder` 使用示例,展示如何将请求参数中的日期字符串转换为 `Date` 类型: ```java import org.springframework.beans.propertyeditors.CustomDateEditor; import org.springframework.stereotype.Controller; import org.springframework.web.bind.WebDataBinder; import org.springframework.web.bind.annotation.InitBinder; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestParam; import java.text.SimpleDateFormat; import java.util.Date; @Controller public class MyController { @InitBinder public void initBinder(WebDataBinder binder) { SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd"); dateFormat.setLenient(false); binder.registerCustomEditor(Date.class, new CustomDateEditor(dateFormat, false)); } @PostMapping("/submit") public String submitForm(@RequestParam("date") Date date) { // 使用绑定后的日期对象处理逻辑 System.out.println("Received date: " + date); return "result"; } } ``` 在这个例子中,`initBinder` 方法通过 `@InitBinder` 注解被标记为数据绑定器的初始化方法。它创建了一个 `SimpleDateFormat` 实例来解析日期字符串,并将其注册为 `Date` 类型的自定义编辑器。这样,当控制器接收到包含日期参数的 POST 请求时,Spring MVC 会自动使用这个编辑器将字符串转换为 `Date` 对象 [^2]。 ### 局限性与注意事项 虽然 `@InitBinder` 提供了强大的功能,但在使用时也需要注意一些限制和最佳实践: - **作用范围**:`@InitBinder` 标记的方法只会影响同一个控制器类中的请求处理方法。如果希望全局生效,可以考虑继承 `WebMvcConfigurer` 并重写 `addFormatters` 方法。 - **线程安全**:由于 `WebDataBinder` 是每个请求单独创建的,因此不需要担心线程安全问题。 - **避免重复绑定**:确保不要多次注册相同的 `PropertyEditor`,以免造成不必要的性能开销。 - **兼容性**:对于较新的 Spring 版本,推荐使用 `Converter` 和 `Formatter` 接口替代统的 `PropertyEditor`,因为它们提供了更好的灵活性和可复用性。 ### 总结 `@InitBinder` 是一个非常有用的工具,尤其适用于需要对数据绑定过程进行细粒度控制的场景。通过合理使用 `@InitBinder`,开发者可以轻松实现复杂的类型转换和格式化逻辑,从而提升应用程序的功能性和健壮性。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值