@Accessors(fluent = true)无法与Jackson协同工作的解决方法
问题根因
@Accessors(fluent = true) 会改写Lombok生成访问器方法的默认命名规则:
- 移除getter方法的
get/is前缀、setter方法的set前缀,例如此处identification字段生成的getter方法名从标准的getIdentification()变为identification(),setter方法名从setIdentification(String)变为identification(String) - Jackson默认的Bean序列化机制依赖
get/set前缀识别类的可访问属性,没有对应前缀的方法不会被判定为属性访问入口,因此扫描不到AccountDTO的任何可序列化属性,最终抛出无序列化器的异常。
可行解决方案
根据项目使用场景选以下任意一种即可:
- 单类适配:给类添加
@JsonAutoDetect注解,修改当前类的属性识别规则@Data @Builder @Accessors(fluent = true) // 配置Jackson直接按字段识别属性,跳过getter/setter前缀校验 @JsonAutoDetect( fieldVisibility = JsonAutoDetect.Visibility.ANY, getterVisibility = JsonAutoDetect.Visibility.NONE, setterVisibility = JsonAutoDetect.Visibility.NONE ) public class AccountDTO implements Serializable { private String identification; } - 全局适配:如果项目中大量使用fluent风格访问器,直接在Spring Boot配置中全局修改Jackson的属性识别规则,无需逐个类加注解
@Configuration public class JacksonConfig { @Bean public Jackson2ObjectMapperBuilderCustomizer fluentAccessorCustomizer() { return builder -> { builder.visibility(PropertyAccessor.FIELD, JsonAutoDetect.Visibility.ANY); builder.visibility(PropertyAccessor.GETTER, JsonAutoDetect.Visibility.NONE); builder.visibility(PropertyAccessor.SETTER, JsonAutoDetect.Visibility.NONE); }; } } - 轻量适配:如果类字段数量少,也可以直接给需要序列化的字段添加
@JsonProperty注解,显式标记为序列化属性@Data @Builder @Accessors(fluent = true) public class AccountDTO implements Serializable { @JsonProperty private String identification; }
内容的提问来源于stack exchange,提问作者Melad Basilius
相关产品推荐
相关产品推荐

