Rest-Assured电商API自动化登录遇UnrecognizedPropertyException求助
问题分析:Rest-Assured反序列化登录响应失败
场景描述
我正在为电商项目搭建基于Rest-Assured的端到端API自动化流程,采用POJO类与序列化/反序列化机制实现。手动在Postman中调用BaseUri为https://rahulshettyacademy.com、路径为/api/ecom/auth/login的登录接口可正常运行,但自动化执行时出现异常。
主API类代码
import io.restassured.builder.RequestSpecBuilder; import io.restassured.http.ContentType; import io.restassured.specification.RequestSpecification; import pojo.EcommerceLoginRequest; import pojo.EcommerceLoginResponse; import static io.restassured.RestAssured.given; public class ECommerceAPITest { public static void main(String[] args) { RequestSpecification req = new RequestSpecBuilder().setBaseUri("https://rahulshettyacademy.com").setContentType(ContentType.JSON).build(); EcommerceLoginRequest loginRequest = new EcommerceLoginRequest(); loginRequest.setUserEmail("imtiyaz_@hotmail.co.uk"); loginRequest.setUserPassword("786Immy110.1"); RequestSpecification reqLogin = given().log().all().spec(req).body(loginRequest); EcommerceLoginResponse loginResponse = reqLogin.when().post("/api/ecom/auth/login").then().log().all().extract().response().as(EcommerceLoginResponse.class); System.out.println(loginResponse.getToken()); System.out.println(loginResponse.getuserid()); } }
对应的EcommerceLoginResponse POJO类代码
package pojo; public class EcommerceLoginResponse { String token; String userid; String message; public String getToken() { return token; } public void setToken(String token) { this.token = token; } public String getuserid() { return userid; } public void setuserid(String userid) { this.userid = userid; } public String getMessage() { return message; } public void setMessage(String message) { this.message = message; } }
运行错误日志
Exception in thread "main" java.lang.RuntimeException: com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException: Unrecognized field "userId" (class pojo.EcommerceLoginResponse), not marked as ignorable (3 known properties: "token", "userid", "message"]) at [Source: (String)"{"token":"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJfaWQiOiI2NGVhMmQ1MDc1M2VmYTQ2NTdmMDBiNDMiLCJ1c2VyRW1haWwiOiJpbXRpeWF6X0Bob3RtYWlsLmNvLnVrIiwidXNlck1vYmlsZSI6MTIzNDU2Nzg5MSwidXNlclJvbGUiOiJjdXN0b21lciIsImlhdCI6MTY5MzA3NjIwNywiZXhwIjoxNzI0NjMzODA3fQ.SZYf86-UPkQwy9UmZEsbt16cNDmYfnLcpRLgGa_aa1A","userId":"64ea2d50753efa4657f00b43","message":"Login Successfully"}"; line: 1, column: 306] (through reference chain: pojo.EcommerceLoginResponse["userId"])
问题根源与修复方案
问题根源
错误日志明确显示:接口返回的JSON字段是驼峰式的userId,但POJO类中定义的对应字段是全小写的userid,Jackson反序列化时无法匹配这两个字段,因此抛出未识别属性的异常。
修复方式
方式一:修改POJO字段名与接口返回一致
将POJO中的userid改为userId,同时更新对应的getter/setter方法名以符合JavaBean规范:
package pojo; public class EcommerceLoginResponse { String token; String userId; String message; public String getToken() { return token; } public void setToken(String token) { this.token = token; } public String getUserId() { return userId; } public void setUserId(String userId) { this.userId = userId; } public String getMessage() { return message; } public void setMessage(String message) { this.message = message; } }
同时修改主类中的打印代码:
System.out.println(loginResponse.getUserId());
方式二:使用Jackson注解指定字段映射
若不想修改POJO字段名,可在userid字段上添加@JsonProperty注解,明确指定其对应JSON中的userId字段:
package pojo; import com.fasterxml.jackson.annotation.JsonProperty; public class EcommerceLoginResponse { String token; @JsonProperty("userId") String userid; String message; public String getToken() { return token; } public void setToken(String token) { this.token = token; } public String getuserid() { return userid; } public void setuserid(String userid) { this.userid = userid; } public String getMessage() { return message; } public void setMessage(String message) { this.message = message; } }
内容的提问来源于stack exchange,提问作者Immy110
相关产品推荐
相关产品推荐

