@PostMapping("/seataTest")
public Result seataTest(@RequestBody CreateOrderRequest request) {
return openOrderService.seataTest(request);
}
@Data
public class CreateOrderRequest {
private String checkinDate;
private Date enterDate;
}
java8的那个注解@DateTimeFormat在用了@RequestBody 时无效的。
这个问题困扰了我很久,刚开始都是用string接受,然后手动转化为Date。
今天,终于发现了解决办法,
方法一,加时区
输入"2020-04-02T12:12:12+08"格式即可,指定了时区-东八区,接受后显示东八区的时间,所以就不需要时区转化
也可以只用日期"2020-04-02",也能接受,没有指定时区,默认0时区,接受的日期自动转化成东八区时间,就是8点
下面错误
日期T时间格式,“2020-04-02T12:12:12”,默认0时区,接受的日期自动转化成东八区时间,就是20点
这种方法缺点是格式不常规,感觉别扭。
方法二,boot自带的反序列化
@JsonComponent 是Spring boot的核心注解,使用@JsonComponent 之后就不需要手动将Jackson的序列化和反序列化手动加入ObjectMapper了。使用这个注解就够了。
加依赖
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.10</version>
</dependency>
配置类
package org.study.mybatis.config;
import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.DeserializationContext;
import com.fasterxml.jackson.databind.JsonDeserializer;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.time.DateUtils;
import org.springframework.boot.jackson.JsonComponent;
import java.io.IOException;
import java.text.ParseException;
import java.util.Date;
/**
* 日期字符串->日期对象
* @author lipo
* @date 2020-04-10 14:09
*/
@JsonComponent
@Slf4j
public class DateDeserialize extends JsonDeserializer<Date> {
private String[] patterns = new String[] {"yyyy-MM-dd HH:mm:ss", "yyyy-MM-dd"};
@Override
public Date deserialize(JsonParser jsonParser, DeserializationContext deserializationContext) throws IOException, JsonProcessingException {
String dateString = jsonParser.getText();
try {
return DateUtils.parseDate(dateString, patterns);
} catch (ParseException e) {
log.error(e.getMessage(), e);
}
return null;
}
}
自动把输入的日期字符串,转化为日期对象,入参就可以用Date类型接受数据了
测试
@RestController
@RequestMapping("user")
@Slf4j
public class UserController {
@PostMapping("/date")
public Object date(@RequestBody UserQuery query) {
Date inDate = query.getInDate();
System.out.println(inDate);
return inDate;
}
}
成功
同时注意上面返回的日期格式,“2020-04-11T04:12:12.000+0000”,+数字表示时区,和第一种方法一致
方法二更好