Spring WebFlux接口返回JSON中member参数来源排查
问题:返回JSON中额外出现
member字段的原因 相关代码
GroupsDTO
@Value @Jacksonized @Builder @JsonIgnoreProperties(ignoreUnknown = true) public class GroupsDTO { Response response; @Value @Jacksonized @Builder public static class Response { int count; @JsonProperty("items") List<GroupDTO> groups; } }
GroupDTO
@Jacksonized @Builder @Value @JsonIgnoreProperties(ignoreUnknown = true) public class GroupDTO { int id; @JsonProperty("is_member") boolean isMember; }
控制器代码
@ResponseStatus(HttpStatus.OK) @GetMapping(value = "/load"/*, produces = MediaType.APPLICATION_NDJSON_VALUE*/) public Mono<GroupsDTO> loadGroups() { var group1 = GroupDTO.builder() .id(1) .isMember(true) .build(); var group2 = GroupDTO.builder() .id(2) .isMember(false) .build(); var response = GroupsDTO.Response.builder() .count(1) .groups(List.of(group1, group2)) .build(); var groups = GroupsDTO.builder() .response(response) .build(); return Mono.just(groups); }
build.gradle
plugins { id 'org.springframework.boot' version '3.0.0-SNAPSHOT' id 'io.spring.dependency-management' version '1.0.13.RELEASE' id 'java' } // ... dependencies { implementation 'org.springframework.boot:spring-boot-starter-webflux' implementation 'org.springframework.boot:spring-boot-starter-data-jpa' implementation 'org.springframework.boot:spring-boot-starter-validation' compileOnly 'org.projectlombok:lombok' developmentOnly 'org.springframework.boot:spring-boot-devtools' runtimeOnly 'org.postgresql:postgresql' annotationProcessor 'org.springframework.boot:spring-boot-configuration-processor' annotationProcessor 'org.projectlombok:lombok' testImplementation 'org.springframework.boot:spring-boot-starter-test' testImplementation 'io.projectreactor:reactor-test' }
接口返回JSON
{"response":{"count":1,"items":[{"id":1,"member":true,"is_member":true},{"id":2,"member":false,"is_member":false}]}}
原因解析
问题根源在于Lombok的@Value注解和Jackson序列化逻辑的交互:
- 对于
isMember这个布尔类型字段,Lombok的@Value注解会生成去掉is前缀的getter方法——即member(),而不是常规的isMember()。 - Jackson默认会通过反射扫描类的getter方法来生成JSON字段,它会把
member()方法解析为member字段;同时你给字段添加了@JsonProperty("is_member")指定了另一个序列化名称,最终导致Jackson同时输出了member和is_member两个重复字段。
解决方法
可以通过调整Lombok的getter注解,让Jackson只识别指定的字段名:
@Jacksonized @Builder @Value @JsonIgnoreProperties(ignoreUnknown = true) public class GroupDTO { int id; @Getter(onMethod_ = {@JsonProperty("is_member")}) boolean isMember; }
内容的提问来源于stack exchange,提问作者The Prototype
相关产品推荐
相关产品推荐

