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
相关产品推荐
相关产品推荐

