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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 15:25:54