【问题标题】:Getting error while passing RequestBody to my RestAPI将请求正文传递给我的 Rest API 时出错
【发布时间】:2023-03-07 03:29:01
【问题描述】:

我正在使用 Spring MVC 创建一个简单的 Rest API。其中一个端点将 JSON 字符串作为请求正文,我希望将其映射到一个对象。下面是数据模型:

public class StudentDataImpl  {

       private String studentName;
       private String studentHobby;
       private String studentMobile;
       private Date studentDOB;

它可以正常工作,但是当我添加另外 2 个变量,即一个数组列表和另一个类对象时,应用程序会出错。

以下是另外 2 个变量:

private ArrayList<String> studentSkills;
private StudentAddressImpl address; 

下面是处理端点请求的方法:

@RequestMapping(value="/students/{studentName}", method = RequestMethod.PUT, produces = MediaType.APPLICATION_JSON_VALUE, consumes = MediaType.APPLICATION_JSON_VALUE )
public StudentDataImpl UpdateStudent(@PathVariable("studentName")  String name, @RequestBody StudentDataImpl student)  {
    

    System.out.println("Student Details are received as below for the given Student "+student.getStudentName());
    System.out.println(student.toString());
        
                    
    return student;
    
}

这是我的 JSON 字符串:

{
    "StudentName": "Mohit Kumar Tyagi",
    "StudentHobby": "Gaming",
    "StudentMobile": "123456789",
    "StudentDOB": "1999-12-25",
    "StudentSkills" : [ "SPRING"],
    "address": [
    {
    "street" : "Street1",
    "city" : "city1",
    "pincode" : "123456",
    "country" : "Country"
    }
    ]
}

如果我使用这个 JSON,它会给我以下错误:

信息:FrameworkServlet 'spring-dispatcher':初始化在 1776 毫秒内完成 公共字符串 ExceptionJSON 解析错误:无法从 START_ARRAY 令牌中反序列化 com.mohit.admission.StudentAddressImpl 的实例;嵌套异常是 com.fasterxml.jackson.databind.exc.MismatchedInputException: 无法从 START_ARRAY 令牌中反序列化 com.mohit.admission.StudentAddressImpl 的实例 在 [来源:(PushbackInputStream);行:7,列:13](通过引用链:com.mohit.admission.StudentDataImpl["address"]

【问题讨论】:

标签: json spring-mvc


【解决方案1】:

JsonMappingException: out of START_ARRAY 令牌异常由 Jackson 对象映射器抛出,因为它期待一个 Object {},而它在响应中找到了一个 Array [{}]。

参考下面的参考

How to fix Out of START_ARRAY token Error

【讨论】:

    【解决方案2】:

    在您的 StudentDataImpl 类中,检查 StudentAddressImpl address 是一个对象,而不是一个数组。所以它期望在 json 中有这样的东西

    "address":  { 
        "street"  : "Street1", 
        "city"    : "city1", 
        "pincode" : "123456", 
        "country" : "Country" 
    } 
    

    不是这个,

    "address":  [{ 
        "street"  : "Street1", 
        "city"    : "city1", 
        "pincode" : "123456", 
        "country" : "Country" 
    }]
    

    您可以通过两种方式解决此问题,或者更改 api 正在接收的 json,就像我现在展示的那样。
    或者把代码改成这样。

    private ArrayList<StudentAddressImpl> address; 
    

    【讨论】:

    • 感谢成功,我更新了 JSON 字符串并且成功了。
    • 如果这解决了您的问题,您介意将其标记为正确答案吗?
    猜你喜欢
    • 1970-01-01
    • 2021-07-15
    • 1970-01-01
    • 1970-01-01
    • 2020-01-30
    • 2017-11-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多