API测试POJO反序列化时遇UnrecognizedPropertyException错误求助
问题排查:POJO反序列化失败(UnrecognizedPropertyException)
问题描述
我正在开展POJO反序列化的端到端流程测试,已创建必要的getter和setter方法。目前access token已成功生成,但后续流程终止,对比其他代码后仍未定位到问题。
核心代码
import static io.restassured.RestAssured.*; import Pojo.getCourse; import io.restassured.path.json.JsonPath; public class oAuth { public static void main(String[] args) throws InterruptedException { try { String Response= given().formParam("client_id", "692183103107-p0m7ent2hk7suguv4vq22hjcfhcr43pj.apps.googleusercontent.com") .formParam("client_secret", "erZOWM9g3UtwNRj340YYaK_W") .formParam("grant_type", "client_credentials") .formParam("scope", "trust") .when().log().all() .post("https://rahulshettyacademy.com/oauthapi/oauth2/resourceOwner/token") .then().extract().asString(); System.out.println(Response); //获取access token JsonPath js = new JsonPath(Response); String token=js.get("access_token"); getCourse gc= given() .queryParam("access_token", token) .when().log().all() .get("https://rahulshettyacademy.com/oauthapi/getCourseDetails").as(getCourse.class); System.out.println(gc.getInstructor()); System.out.println(gc.getUrl()); }catch(Exception e) { e.printStackTrace(); } } }
输出日志
Request method: POST Request URI: https://rahulshettyacademy.com/oauthapi/oauth2/resourceOwner/token Proxy: <none> Request params: <none> Query params: <none> Form params: client_id=692183103107-p0m7ent2hk7suguv4vq22hjcfhcr43pj.apps.googleusercontent.com client_secret=erZOWM9g3UtwNRj340YYaK_W grant_type=client_credentials scope=trust Path params: <none> Headers: Accept=*/* Content-Type=application/x-www-form-urlencoded; charset=ISO-8859-1 Cookies: <none> Multiparts: <none> Body: <none> {"access_token":"zY5\/lo\/BctLhD7IPoqI5MA==","token_type":"Bearer","expires_in":3600,"refresh_token":"5Ex59Tctbv5c+xMNH9SnGQ==","scope":"create"} Request method: GET Request URI: https://rahulshettyacademy.com/oauthapi/getCourseDetails?access_token=zY5%2Flo%2FBctLhD7IPoqI5MA%3D%3D Proxy: <none> Request params: <none> Query params: access_token=zY5/lo/BctLhD7IPoqI5MA== Form params: <none> Path params: <none> Headers: Accept=*/* Cookies: <none> Multiparts: <none> Body: <none> java.lang.RuntimeException: com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException: 无法识别字段"linkedIn"(类Pojo.getCourse),未标记为可忽略(已知6个属性:"expertise","courses","instructor","services","url","linkedin") at [Source: REDACTED (`StreamReadFeature.INCLUDE_SOURCE_IN_LOCATION` disabled); line: 1, column: 500] (through reference chain: Pojo.getCourse["linkedIn"]) at io.restassured.internal.path.json.mapping.JsonPathJackson2ObjectDeserializer.deserialize(JsonPathJackson2ObjectDeserializer.java:30) at io.restassured.path.json.mapping.JsonPathObjectDeserializer$deserialize.call(Unknown Source) at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:45) at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:125) at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:139) at io.restassured.internal.mapping.Jackson2Mapper.deserialize(Jackson2Mapper.groovy:58) at io.restassured.mapper.ObjectMapper$deserialize.call(Unknown Source) at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:45) at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:125) at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:139) at io.restassured.internal.mapping.ObjectMapping.parseWithJackson2(ObjectMapping.groovy:254) at io.restassured.internal.mapping.ObjectMapping$parseWithJackson2$0.callStatic(Unknown Source) at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCallStatic(CallSiteArray.java:53) at org.codehaus.groovy.runtime.callsite.AbstractCallSite.callStatic(AbstractCallSite.java:217) at org.codehaus.groovy.runtime.callsite.AbstractCallSite.callStatic(AbstractCallSite.java:240) at io.restassured.internal.mapping.ObjectMapping.deserialize(ObjectMapping.groovy:56) at io.restassured.internal.mapping.ObjectMapping$deserialize.call(Unknown Source) at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:45) at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:125) at io.restassured.internal.RestAssuredResponseOptionsGroovyImpl.as(RestAssuredResponseOptionsGroovyImpl.groovy:229) at io.restassured.internal.RestAssuredResponseOptionsImpl.as(RestAssuredResponseOptionsImpl.java:169) at oAuth.main(oAuth.java:26) Caused by: com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException: 无法识别字段"linkedIn"(类Pojo.getCourse),未标记为可忽略(已知6个属性:"expertise","courses","instructor","services","url","linkedin") at [Source: REDACTED (`StreamReadFeature.INCLUDE_SOURCE_IN_LOCATION` disabled); line: 1, column: 500] (through reference chain: Pojo.getCourse["linkedIn"]) at com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException.from(UnrecognizedPropertyException.java:61) at com.fasterxml.jackson.databind.DeserializationContext.handleUnknownProperty(DeserializationContext.java:1153) at com.fasterxml.jackson.databind.deser.std.StdDeserializer.handleUnknownProperty(StdDeserializer.java:2224) at com.fasterxml.jackson.databind.deser.BeanDeserializerBase.handleUnknownProperty(BeanDeserializerBase.java:1793) at com.fasterxml.jackson.databind.deser.BeanDeserializerBase.handleUnknownVanilla(BeanDeserializerBase.java:1771) at com.fasterxml.jackson.databind.deser.BeanDeserializer.vanillaDeserialize(BeanDeserializer.java:316) at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserialize(BeanDeserializer.java:177) at com.fasterxml.jackson.databind.deser.DefaultDeserializationContext.readRootValue(DefaultDeserializationContext.java:342) at com.fasterxml.jackson.databind.ObjectMapper._readMapAndClose(ObjectMapper.java:4899) at com.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:3846) at io.restassured.internal.path.json.mapping.JsonPathJackson2ObjectDeserializer.deserialize(JsonPathJackson2ObjectDeserializer.java:28) ... 21 more
问题原因及解决方案
问题根源
报错信息明确指出:JSON响应中的字段是linkedIn(驼峰格式,第二个字母大写),但POJO类getCourse中对应的属性是linkedin(全小写),Jackson默认严格匹配字段名,导致无法识别该字段,抛出反序列化异常。
解决方法
方法1:修改POJO属性名(推荐)
将getCourse类中的属性名从linkedin改为linkedIn,同时更新对应的getter和setter方法为getLinkedIn()和setLinkedIn(),保持和JSON字段名完全一致。
方法2:使用Jackson注解映射字段
如果不想修改属性名,可以在linkedin字段上添加@JsonProperty注解,指定它对应的JSON字段名:
import com.fasterxml.jackson.annotation.JsonProperty; public class getCourse { // 其他属性... @JsonProperty("linkedIn") private String linkedin; // 对应的getter/setter public String getLinkedin() { return linkedin; } public void setLinkedin(String linkedin) { this.linkedin = linkedin; } }
方法3:忽略未知字段(临时方案)
在getCourse类上添加@JsonIgnoreProperties(ignoreUnknown = true)注解,让Jackson忽略所有未匹配的字段,但不推荐长期使用,因为会掩盖其他字段匹配错误:
import com.fasterxml.jackson.annotation.JsonIgnoreProperties; @JsonIgnoreProperties(ignoreUnknown = true) public class getCourse { // 类内容... }
内容的提问来源于stack exchange,提问作者Ansuman Prasad Pati
相关产品推荐
相关产品推荐

