三十八、SpringBoot中使用@RequestBody时如何自定义需要转换的日期格式

1.创建日期转换类

package com.bms.config.time;

import com.bms.util.CommonUtils;
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 org.apache.commons.lang3.StringUtils;
import org.apache.commons.lang3.time.DateUtils;

import java.io.IOException;
import java.text.ParseException;
import java.time.LocalDateTime;
import java.util.Date;

/**
 * 自定义Jackson反序列化日期类型时应用的类型转换器,一般用于@RequestBody接受参数时使用
 * @author 咸鱼
 * @date 2019-07-12 21:15
 */
public class DateJacksonConverter extends JsonDeserializer<LocalDateTime> {
    private final static String[] PATTERN =
            new String[]{"yyyy-MM-dd", "yyyy-MM-dd HH:mm", "yyyy-MM-dd HH:mm:ss", "yyyy-MM-dd HH:mm:ss.S",
                    "yyyy.MM.dd", "yyyy.MM.dd HH:mm", "yyyy.MM.dd HH:mm:ss", "yyyy.MM.dd HH:mm:ss.S",
                    "yyyy/MM/dd", "yyyy/MM/dd HH:mm", "yyyy/MM/dd HH:mm:ss", "yyyy/MM/dd HH:mm:ss.S"};
    @Override
    public LocalDateTime deserialize(JsonParser p, DeserializationContext ctxt) throws IOException, JsonProcessingException {
        Date targetDate = null;
        String originDate = p.getText();
        if (!StringUtils.isBlank(originDate)) {
            try {
                long longDate = Long.parseLong(originDate.trim());
                targetDate = new Date(longDate);
            } catch (NumberFormatException e) {
                try {
                    targetDate = DateUtils.parseDate(originDate, PATTERN);
                } catch (ParseException e1) {
                    throw new IOException(String.format(
                            "'%s' can not convert to type 'java.util.Date',just support timestamp(type of long) and following date format(%s)",
                            originDate,
                            StringUtils.join(PATTERN, ",")));
                }
            }
        }
        return CommonUtils.date2LocalDateTime(targetDate);
    }

    @Override
    public Class<?> handledType() {
        return LocalDateTime.class;
    }
}


2.配置全局的日期类型转换器

package com.bms.config.time;

import com.fasterxml.jackson.databind.ObjectMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.converter.json.Jackson2ObjectMapperFactoryBean;
import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter;

/**
 * 全局的日期类型转换器
 * @author 咸鱼
 * @date 2019-07-12 21:24
 */
@Configuration
public class ConverterConfig {
    @Bean
    public DateJacksonConverter dateJacksonConverter() {
        return new DateJacksonConverter();
    }
    @Bean
    public Jackson2ObjectMapperFactoryBean jackson2ObjectMapperFactoryBean(
            @Autowired DateJacksonConverter dateJacksonConverter) {
        Jackson2ObjectMapperFactoryBean jackson2ObjectMapperFactoryBean = new Jackson2ObjectMapperFactoryBean();
        jackson2ObjectMapperFactoryBean.setDeserializers(dateJacksonConverter);
        return jackson2ObjectMapperFactoryBean;
    }
    @Bean
    public MappingJackson2HttpMessageConverter mappingJackson2HttpMessageConverter(
            @Autowired ObjectMapper objectMapper) {
        MappingJackson2HttpMessageConverter mappingJackson2HttpMessageConverter = new MappingJackson2HttpMessageConverter();
        mappingJackson2HttpMessageConverter.setObjectMapper(objectMapper);
        return mappingJackson2HttpMessageConverter;
    }
}

首先,需要确定@RequestBody是用于绑定HTTP请求的HTTP请求主体(body)到方法参数或方法返回值上的注解。当使用@RequestBody注解SpringBoot会自动将处理程序方法参数绑定到HTTP请求主体的JSON对象上。 如果@RequestBody的请求主体JSON为null,则有可能是请求的Content-Type与数据类型不匹配。例如,请求的Content-Type为application/json,但是请求体的格式不是JSON,或者请求体的JSON格式存在问题,导致SpringBoot无法将其转换为对象。 解决这个问题需要按照以下步骤进行: 1. 确认请求主体是否为null,这可以通过在方法打印日志或使用调试器进行调试来实现。 2. 确认请求头的Content-Type是否与请求主体的数据格式相匹配。 3. 确认请求体的JSON格式是否正确,可以使用JSON 校验工具确认。 4. 如果以上步骤均无法解决问题,则可以考虑使用自定义JSON反序列化器。 在自定义反序列化器,可以通过添加注解@JsonDeserialize(using = CustomDeserializer.class)来指定自定义反序列化器。这样,在接收到JSON请求主体SpringBoot使用自定义反序列化器将JSON数据转换为Java对象。如果仍然无法解决问题,可以查看SpringBoot的日志文件,查找相关错误信息进行解决。 总之,当SpringBoot的@RequestBody接收JSON为null需要仔细检查请求格式是否正确并考虑使用自定义反序列化器解决问题。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值