标签:不能 请求 get ack encode 监听 表单 cannot json
Spring中存在两个地方可以设置日期格式,一个是 spring.mvc.date-format
,还有一个是spring.jackson.date-format
。现在说说他们的区别。
spring.mvc.date-format
是针对x-www-form-urlencoded
这种编码的数据,也就是通过表单<form>
上传上来的数据。
我们假设Java的代码是这样,并且在localhost:80监听:
//POJO
pubulic class OneDate{
private String name;
private Date date;
//省略函数
}
//Controller
@Controller
public class OneController{
@RequestMapping("/up")
public String getDate(OneDate d){
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss Z");
System.out.println(format.format(d));
return "onePage";
}
}
这是我们使用curl进行测试。
以下可以通过:
#POST
curl -X POST -d 'name=build&date=2000/1/2' 'http://localhost/up'
curl -X POST -d 'name=build&date=2000/1/2 14:32:56' 'http://localhost/up'
curl -X POST -d 'name=build&date=2000/1/2 14:32:56 GMT' 'http://localhost/up'
curl -X POST -d 'name=build&date=Jan 2 2000 14:32:56 GMT' 'http://localhost/up'
# 使用GET也是一样的
curl 'http://localhost/json?name=build&date=2000/2/3%2014:32:56'
但是使用横杠分割就不行。
curl -X POST -d 'name=build&date=2000-1-2 14:32:56' 'http://localhost/up'
# 这里会返回错误信息: Failed to convert from type [java.lang.String] to type [java.util.Date]
这里的原理是,当没有配置spring.mvc.date-format
这个选项时,spring会使用Date的一个废弃的构造函数
@Deprecated
public Date(String s) {
this(parse(s));
}
来进行字符串到日期的转换。能否转换成功取决于这个parse函数。所以还是应该显式地设置好这个配置项。
注意!设置好后,默认的parse就不会生效了,只会使用设置的格式。
这里不设置时区的话,就会使用服务端的本地时区。所以完美一点的话,应该在格式中把时区也加上。
spring.jackson.date-format
则是设置识别HTTP请求的body中的日期字符串的格式。对应的类型是application/json
。
假设我们有这样的Java代码(POJO同上):
@Controller
public class OneController2{
@PostMapping("/up")
public String getDate2(@RequestBody OneDate d){
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss Z");
System.out.println(format.format(d));
return "onePage";
}
}
然后我们用curl继续测试。
curl -X POST -d '{"name":"build","date":"2020/2/12"}' -H "Content-Type: application/json" 'http://localhost/up'
这个语句会返回错误(没想到吧?json这里默认不是用斜线!和之前的不一样!)
错误语句说: Cannot parse date \"2020/2/12\": not compatible with any of standard forms (\"yyyy-MM-dd‘T‘HH:mm:ss.SSSZ\", \"yyyy-MM-dd‘T‘HH:mm:ss.SSS\", \"EEE, dd MMM yyyy HH:mm:ss zzz\", \"yyyy-MM-dd\"));
可以看出jackson里的设置了四个格式。如果都不匹配则会报错。
正确的示例如下:
"2020-2-2" #仅日期,对应yyyy-MM-dd
# 对应 EEE, dd MMM yyyy HH:mm:ss zzz ,
“Wed, 12 Feb 2020 13:45:56 GMT” # 对应JS中的toGMTString()
“Wed, 12 Feb 2020 13:45:56 +0800”
# 对应 yyyy-MM-dd'T'HH:mm:ss.SSS
“2020-02-03T13:45:56.142” # 这里不能写成2020-2-3
# 对应 yyyy-MM-dd'T'HH:mm:ss.SSSZ ,对应JS的toISOString()
“2020-02-03T13:45:56.142Z” # Z代表0时区,中国是+8时区
注意!与上一节不同,jackson里不写时区,默认就是0时区。
想要设置默认时区,使用spring.jackson.time-zone=GMT+8
标签:不能 请求 get ack encode 监听 表单 cannot json
原文地址:https://www.cnblogs.com/modyuan/p/12302121.html