入参为字符串用日期对象接收

在Java8中,@DateTimeFormat注解在@RequestBody注解的参数上可能无效。本文介绍了两种解决办法:一是通过指定时区的日期字符串格式进行转换,二是利用Spring Boot的@JsonComponent进行日期反序列化,避免手动转换,提高代码简洁性。
摘要由CSDN通过智能技术生成

    @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”,+数字表示时区,和第一种方法一致
方法二更好

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值