Spring-Boot HTTP传输中的Date类型的转换
2018-08-28 本文已影响131人
Seven鑫洋
数据往后台传输
- 前台ajax参数格式为:
var param1={
id:1234,
name:'名称',
path:'路径',
createdDate:'2017-01-05 12:45:32'
}
- ajax 调用
$.get("http://***********/ajaxApi/getOfBean",param, function(result){
console.info("result:"+JSON.stringify(result));
})
- 后台接收参数的Bean实体类
public class Ajax implements Serializable{
private Long id;
private String name;
private String path;
private Date createdDate;
}
- 后台spring-boot提供的接口
@RestController
@RequestMapping(value="ajaxApi")
@Api(value = "/ajaxApi", description = "异步接口测试API",tags={"/ajaxApi"})
public class AjaxController {
private static final Logger logger = LoggerFactory.getLogger(AjaxController.class);
/***
* 异步参数接收
* @return
*/
@RequestMapping(value = "/getOfBean")
@ApiOperation("Bean实体参数")
public Ajax getOfBean(Ajax ajax) throws Exception{
logger.info("异步参数接收:{}",ajax.toString());//打印接收的对象
return ajax;
}
}
发起ajax请求后会报错
<span style="font-size:18px;color:#ff0000;">Failed to convert property value of type 'java.lang.String' to required type 'java.util.Date' for property 'createdDate';
nested exception is org.springframework.core.convert.ConversionFailedException:
Failed to convert from type [java.lang.String] to type [java.util.Date] for value '2017-01-05 12:45:32';
nested exception is java.lang.IllegalArgumentException</span>
这是因为ajax使用json字符串将日期发送给后台,后台无法将string类型转换为date类型。</br>
解决方法如下:
- [x] 在Bean实体字段或参数上增加@DateTimeFormat注解
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date createdDate;
- [x] 在接收参数的的Controller中增加@InitBinder转化方法
@InitBinder
protected void initBinder(WebDataBinder binder) {
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
binder.registerCustomEditor(Date.class, new CustomDateEditor(dateFormat, true));
}
- [x] 配置全局的日期转换器
/**
* 转换解析器
*/
@Configuration
public class MappingConverterAdapter {
/***
* 日期参数接收转换器,将json字符串转为日期类型
* @return
*/
@Bean
public Converter<String, Date> DateConvert() {
return new Converter<String, Date>() {
@Override
public Date convert(String source) {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date date = null;
try {
date = sdf.parse((String) source);
} catch (Exception e) {
e.printStackTrace();
}
return date;
}
};
}
}
- [x] 配置Formatter日期转换器
/**
* 日期转换器
*/
@Configuration
public class DateConfig {
/***
* Date日期类型转换器
* @return
*/
@Bean
public Formatter<Date> dateFormatter() {
return new Formatter<Date>() {
@Override
public Date parse(String text, Locale locale) throws ParseException {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date date = null;
try {
date = sdf.parse(text);
} catch (Exception e) {
e.printStackTrace();
}
return date;
}
@Override
public String print(Date object, Locale locale) {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
return sdf.format(object);
}
};
}
}
然后再启动服务,访问正常。
Date数据传到前台
如果后台从数据库查出日期类型的数据,往前台传的时候需要使用JsonFormat注解
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone="GMT+8")
private Date effectiveBegin;
timezone="GMT+8" 代表北京时间东八区