你的浏览器不支持canvas

做你害怕做的事情,然后你会发现,不过如此。

SpringMVC使用@InitBinder注解实现用Date接收时间戳

时间: 作者: 黄运鑫

本文章属原创文章,未经作者许可,禁止转载,复制,下载,以及用作商业用途。原作者保留所有解释权。


例:使用Date接收时间戳的问题

  • 当前端提交的时间格式为时间戳时,如果接口使用Date类型接收,由于参数类型不匹配会报错Failed to convert from type [java.lang.String] to type [java.util.Date] for value '1522512000000',接口代码如下:
/**
 * @author hyx
 */
@RestController
@RequestMapping(value = "/test")
public class TestController {
    @PostMapping
    public String create(Date date) {
        return "1";
    }
}

使用@InitBinder解析参数

  • 使用@InitBinder注解可以自定义格式化参数方法。
  • controller中加入解析器,代码如下:
/**
 * @author hyx
 */
@RestController
@RequestMapping(value = "/test")
public class TestController {

    @InitBinder
    public void initBinder(WebDataBinder binder, WebRequest request) {
        // 转换日期格式
        binder.registerCustomEditor(Date.class, new PropertyEditorSupport() {
            @Override
            public void setAsText(String text) throws IllegalArgumentException {
                try {
                    //将时间戳换换为Date类型
                    setValue(text == null ? null : new Date(Long.valueOf(text)));
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });
    }

    @PostMapping
    public String create(Date date) {
        return "1";
    }
}
  • controller中的解析代码只在当前controller有效。
  • 也可以注册全局的解析器,对所有controller有效。

全局的参数解析

  • 使用@ControllerAdvice注解配置全局参数解析,代码如下:
/**
 * @author hyx
 */
@ControllerAdvice
public class GlobalControllerAdvice {
    @InitBinder
    public void initBinder(WebDataBinder binder, WebRequest request) {
        // 转换日期格式
        binder.registerCustomEditor(Date.class, new PropertyEditorSupport() {
            @Override
            public void setAsText(String text) throws IllegalArgumentException {
                try {
                    //将时间戳换换为Date类型
                    setValue(text == null ? null : new Date(Long.valueOf(text)));
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });
    }
}

对于本文内容有问题或建议的小伙伴,欢迎在文章底部留言交流讨论。