Hibernate使用jsonb类型时能否自定义调整JSON字段默认排序?
问题原因
你用到的com.vladmihalcea hibernate-types包默认使用独立的ObjectMapper实例完成JSON序列化/反序列化逻辑,没有复用Spring容器中配置的Jackson上下文,因此你加在PersonInfo类上的@JsonPropertyOrder等Jackson注解无法被识别生效。
解决方法
方法1:全局配置复用Spring ObjectMapper(推荐)
直接把Spring Boot自动配置好的ObjectMapper注入到hibernate-types的配置中,所有Jackson注解都会自动生效,不需要额外修改类型定义。
新增Spring配置类如下:
import com.vladmihalcea.hibernate.type.util.Configuration; import org.springframework.boot.autoconfigure.orm.jpa.HibernatePropertiesCustomizer; import org.springframework.context.annotation.Bean; @org.springframework.context.annotation.Configuration public class HibernateJsonConfig { @Bean public HibernatePropertiesCustomizer hibernateJsonPropertiesCustomizer(com.fasterxml.jackson.databind.ObjectMapper objectMapper) { return hibernateProperties -> { // 让hibernate-types复用Spring容器中已配置好的ObjectMapper Configuration.getObjectMapperHolder().setObjectMapper(objectMapper); }; } }
配置完成后,你原有的@JsonPropertyOrder、@JsonSerialize、@JsonFormat注解都会直接生效。
方法2:自定义JSON类型实现局部配置
如果你只需要调整PersonInfo这一个类的序列化规则,可以自定义继承JsonBinaryType的自定义类型,指定支持顺序配置的ObjectMapper:
- 编写自定义Json类型类
import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule; import com.vladmihalcea.hibernate.type.json.JsonBinaryType; public class CustomJsonBinaryType extends JsonBinaryType { public CustomJsonBinaryType() { super(new ObjectMapper() // 注册JDK8时间类型序列化模块 .registerModule(new JavaTimeModule()) // 关闭字母序排序,优先使用@JsonPropertyOrder配置 .configure(com.fasterxml.jackson.databind.MapperFeature.SORT_PROPERTIES_ALPHABETICALLY, false) ); } }
- 修改Entity上的
@TypeDef配置,替换为自定义类型:
@TypeDef(name = "jsonb", typeClass = CustomJsonBinaryType.class)
补充说明
PostgreSQL的jsonb类型为了提升查询性能,采用二进制结构存储,本身不会保留键的插入顺序。如果你需要直接在数据库查询返回JSON字符串时就保留指定顺序,可以把Person类中字段的columnDefinition从jsonb改为json即可。
内容的提问来源于stack exchange,提问作者Сергей Аблаев
相关产品推荐
相关产品推荐

