例:使用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();
}
}
});
}
}