You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 10:30:53