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

Rest Assured中如何排除POJO指定字段不生成请求Payload

如何在Rest Assured中排除POJO指定字段生成POST请求Payload?

我正在使用Rest Assured框架,需要在生成POST请求Payload时,排除POJO类DispositionStatus中已声明的name和code字段。以下是相关代码及期望的Payload格式,请问需要对StepDefinition做哪些修改?

POJO代码

package pojo;

import java.util.List;

public class DispositionStatus {

    private String name;
    private String code;
    private String dispositionList;
    private String parentDisposition;
    private List<Data> data;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getCode() {
        return code;
    }

    public void setCode(String code) {
        this.code = code;
    }

    public String getDispositionList() {
        return dispositionList;
    }

    public void setDispositionList(String dispositionList) {
        this.dispositionList = dispositionList;
    }

    public String getParentDisposition() {
        return parentDisposition;
    }

    public void setParentDisposition(String parentDisposition) {
        this.parentDisposition = parentDisposition;
    }

    public List<Data> getData() {
        return data;
    }

    public void setData(List<Data> data) {
        this.data = data;
    }

}

StepDefinition代码

@Then("Uses the token and create Bulk disposition status payload with {string} {string}")
public void uses_the_token_generated_and_created_bulk_disposition_status_payload(String name , String code)
        throws IOException {
    Data firstStatus = new Data("NoAnswer","NOANS");
    Data secondStatus = new Data("Answer", "ANSWR");
    datajson.add(firstStatus);
    datajson.add(secondStatus);
    res = given().spec(requestSpecification()).body(data.addDispositionStatus(name, code, listId, datajson))
            .relaxedHTTPSValidation();
}

期望的Payload格式

{
    "data": [
        {
            "test": "saumy",
            "test2": "say1y"
        },
        {
            "test": "saumy",
            "test2": "say1y"
        }
    ],
    "dispositionList": "11379"
}

我不需要在Payload中包含name和code字段。


解决方案

方法1:修改POJO添加Jackson注解(全局生效,推荐)

Rest Assured默认用Jackson做JSON序列化,直接在DispositionStatus类的name和code字段上添加@JsonIgnore注解,序列化时会自动忽略这两个字段:

import com.fasterxml.jackson.annotation.JsonIgnore;

public class DispositionStatus {

    @JsonIgnore
    private String name;
    @JsonIgnore
    private String code;
    // 其余字段、方法保持不变
}

修改后StepDefinition无需改动,原代码生成的Payload会自动排除目标字段。

方法2:在StepDefinition中配置序列化过滤(临时生效,不修改POJO)

如果不想改动POJO类,可以自定义Jackson的ObjectMapper,通过过滤器指定要排除的字段:

import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.ser.FilterProvider;
import com.fasterxml.jackson.databind.ser.impl.SimpleBeanPropertyFilter;
import com.fasterxml.jackson.databind.ser.impl.SimpleFilterProvider;
import com.fasterxml.jackson.annotation.JsonFilter;

@Then("Uses the token and create Bulk disposition status payload with {string} {string}")
public void uses_the_token_generated_and_created_bulk_disposition_status_payload(String name , String code)
        throws IOException {
    Data firstStatus = new Data("NoAnswer","NOANS");
    Data secondStatus = new Data("Answer", "ANSWR");
    datajson.add(firstStatus);
    datajson.add(secondStatus);
    
    // 创建排除字段的过滤器
    SimpleBeanPropertyFilter filter = SimpleBeanPropertyFilter.serializeAllExcept("name", "code");
    FilterProvider filters = new SimpleFilterProvider().addFilter("excludeNameAndCode", filter);
    
    // 配置自定义ObjectMapper,通过MixIn给POJO动态添加过滤器注解
    ObjectMapper mapper = new ObjectMapper();
    mapper.setFilterProvider(filters);
    mapper.addMixIn(DispositionStatus.class, FilterMixIn.class);
    
    // 将POJO转为符合要求的JSON字符串
    String payload = mapper.writeValueAsString(data.addDispositionStatus(name, code, listId, datajson));
    
    res = given().spec(requestSpecification()).body(payload)
            .relaxedHTTPSValidation();
}

// 定义MixIn类,避免直接修改原POJO
abstract class FilterMixIn {
    @JsonFilter("excludeNameAndCode")
    private DispositionStatus dispositionStatus;
}

方法3:改用Map构建Payload(灵活定制,无需POJO序列化)

如果只是单次请求需要特定格式,直接用HashMap构建Payload,完全控制字段内容:

import java.util.HashMap;
import java.util.Map;

@Then("Uses the token and create Bulk disposition status payload with {string} {string}")
public void uses_the_token_generated_and_created_bulk_disposition_status_payload(String name , String code)
        throws IOException {
    Data firstStatus = new Data("NoAnswer","NOANS");
    Data secondStatus = new Data("Answer", "ANSWR");
    datajson.add(firstStatus);
    datajson.add(secondStatus);
    
    // 手动构建符合要求的Payload
    Map<String, Object> payload = new HashMap<>();
    payload.put("dispositionList", listId);
    payload.put("data", datajson);
    
    res = given().spec(requestSpecification()).body(payload)
            .relaxedHTTPSValidation();
}

内容的提问来源于stack exchange,提问作者ayush

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 03:52:44