RestAssured调用REST API更新时遇Jackson未识别'id'字段错误
解决Jackson反序列化时未识别'id'字段的问题
错误原因
执行get("/posts/{id}")获取数据时,接口返回的JSON包含id字段,但你的BookingDetails类未定义该属性,Jackson默认会将未识别的字段视为错误,因此抛出UnrecognizedPropertyException。
解决方法
方法1:在POJO类中添加'id'属性
直接在BookingDetails类中添加id字段并配上@JsonProperty注解,让Jackson正确映射该字段:
package pojoClasses; import com.fasterxml.jackson.annotation.JsonProperty; public class BookingDetails { @JsonProperty private String title; @JsonProperty private String author; @JsonProperty private String createdat; @JsonProperty private Integer id; // 添加id字段 // 修正getter方法(原方法带参数不符合JavaBean规范) public String getTitle() { return this.title; } public void setTitle(String title) { this.title = title; } public String getAuthor() { return this.author; } public void setAuthor(String author) { this.author = author; } public String getCreatedat() { return this.createdat; } public void setCreatedat(String createdat) { this.createdat = createdat; } // id的getter/setter public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } }
注意:原代码中的getter方法(如
gettitle(String title))不符合JavaBean规范,会导致Jackson序列化/反序列化异常,建议修正为无参getter。
方法2:用注解忽略未知字段
在BookingDetails类上添加@JsonIgnoreProperties(ignoreUnknown = true)注解,让Jackson自动忽略未定义的字段:
package pojoClasses; import com.fasterxml.jackson.annotation.JsonProperty; import com.fasterxml.jackson.annotation.JsonIgnoreProperties; @JsonIgnoreProperties(ignoreUnknown = true) // 添加该注解 public class BookingDetails { // 原有代码... }
方法3:全局配置Jackson忽略未知字段
如果不想给每个POJO类加注解,可以在BaseTest中全局配置RestAssured的ObjectMapper,让所有反序列化操作忽略未知字段:
import com.fasterxml.jackson.databind.DeserializationFeature; import com.fasterxml.jackson.databind.ObjectMapper; import io.restassured.config.ObjectMapperConfig; import io.restassured.config.RestAssuredConfig; public class BaseTest { static { RestAssured.config = RestAssured.config().objectMapperConfig(new ObjectMapperConfig().jackson2ObjectMapperFactory( (type, s) -> { ObjectMapper mapper = new ObjectMapper(); // 关闭未知字段报错 mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); return mapper; } )); } }
额外提示
代码中调用getResponse.as(BookingDetails.class)是将GET返回的JSON转成BookingDetails对象,而GET接口返回的JSON包含id,这就是报错的触发点。以上三种方法任选其一即可解决问题,推荐方法2或3,如果你不需要在POJO中处理id字段的话。
内容的提问来源于stack exchange,提问作者Learner
相关产品推荐
相关产品推荐

