说明
- 环境:SpringBoot3.0.2
- LocalDateTime本身用法可参考:【jdk1.8】LocalDateTime 详细用法,保姆级 - yīyáng - 博客园 (cnblogs.com)
Jackson
依赖
默认引入spring-boot-starter-web,即自动引入Jackson;
配置ObjectMapper
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;
import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateDeserializer;
import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateTimeDeserializer;
import com.fasterxml.jackson.datatype.jsr310.deser.LocalTimeDeserializer;
import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateSerializer;
import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateTimeSerializer;
import com.fasterxml.jackson.datatype.jsr310.ser.LocalTimeSerializer;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;
import java.time.format.DateTimeFormatter;
/**
* jackson配置
*
* @author liaorj
* @date 2024/03/21
*/
@Configuration
public class JacksonConfig {
/**
* jackson配置ObjectMapper对LocalDateTime的序列化、反序列化
*
* @return
*/
@Bean
public ObjectMapper objectMapper() {
ObjectMapper objectMapper = new ObjectMapper();
// other serializer and deSerializer config ...
JavaTimeModule javaTimeModule = new JavaTimeModule();
javaTimeModule.addSerializer(LocalDate.class, new LocalDateSerializer(DateTimeFormatter.ofPattern("yyyy-MM-dd")));
javaTimeModule.addDeserializer(LocalDate.class, new LocalDateDeserializer(DateTimeFormatter.ofPattern("yyyy-MM-dd")));
javaTimeModule.addSerializer(LocalTime.class, new LocalTimeSerializer(DateTimeFormatter.ofPattern("HH:mm:ss")));
javaTimeModule.addDeserializer(LocalTime.class, new LocalTimeDeserializer(DateTimeFormatter.ofPattern("HH:mm:ss")));
javaTimeModule.addSerializer(LocalDateTime.class, new LocalDateTimeSerializer(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
javaTimeModule.addDeserializer(LocalDateTime.class, new LocalDateTimeDeserializer(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
objectMapper.registerModule(javaTimeModule);
return objectMapper;
}
/*@Bean
public Jackson2ObjectMapperBuilderCustomizer jackson2ObjectMapperBuilderCustomizer() {
return jacksonObjectMapperBuilder -> {
jacksonObjectMapperBuilder.serializerByType(LocalDate.class, new LocalDateSerializer(DateTimeFormatter.ofPattern("yyyy-MM-dd")));
jacksonObjectMapperBuilder.deserializerByType(LocalDate.class, new LocalDateDeserializer(DateTimeFormatter.ofPattern("yyyy-MM-dd")));
jacksonObjectMapperBuilder.serializerByType(LocalTime.class, new LocalTimeSerializer(DateTimeFormatter.ofPattern("HH:mm:ss")));
jacksonObjectMapperBuilder.deserializerByType(LocalTime.class, new LocalTimeDeserializer(DateTimeFormatter.ofPattern("HH:mm:ss")));
jacksonObjectMapperBuilder.serializerByType(LocalDateTime.class, new LocalDateTimeSerializer(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
jacksonObjectMapperBuilder.deserializerByType(LocalDateTime.class, new LocalDateTimeDeserializer(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
};
}*/
}
使用ObjectMapper
从spring容器中注入,才能生效,直接new的话本人试过,会报错。
@Resource
private ObjectMapper objectMapper;
使用@JsonFormat
- 直接使用该注解,不依赖上述配置;
- get出参、post出参和入参使用;
@JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
private LocalDate date;
@JsonFormat(pattern = "HH:mm:ss", timezone = "GMT+8")
private LocalTime startTime;
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
private LocalDateTime createTime;
使用@DateTimeFormat
- 直接使用该注解,不依赖上述配置;
- get入参使用;
@DateTimeFormat(pattern = "yyyy-MM-dd")
private LocalDate date;
配置RabbitMQ消息转换器
- 依赖上述ObjectMapper配置,否则格式化LocalDateTime字段异常;
- 在注册RabbitMQ消息转换器时,需传入ObjectMapper对象;
- 代码中的自动创建消息id设置,与本主题无关;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.springframework.amqp.support.converter.Jackson2JsonMessageConverter;
import org.springframework.amqp.support.converter.MessageConverter;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
/**
* rabbitmq配置
*
* @author liaorj
* @date 2024/02/26
*/
@Configuration
public class RabbitMQConfig {
/**
* AMQP消息转换器,
* 原本是jdk序列化的,由于消息空间占用较大,且不友好,所以配置该转换器。
* 发送端和消费端都配置。
* @return
*/
@Bean
public MessageConverter messageConverter(ObjectMapper objectMapper) {
//定义消息转换器
Jackson2JsonMessageConverter converter = new Jackson2JsonMessageConverter(objectMapper);
//配置自动创建消息id,用于识别不同消息,也可以在业务中基于id判断消息是否重复
converter.setCreateMessageIds(true);
return converter;
}
}
可能遇到的异常
以上没设置好,可能遇到的异常:
1、LocalDateTime格式化异常:
`java.time.LocalDate` not supported by default: add Module "com.fasterxml.jackson.datatype:jackson-datatype-jsr310"
2、RabbitMQ消息转换异常:
MessageConversionException: Failed to convert Message content]
FastJson
待续...