簡體   English   中英

Spring-Boot REST API 無法解析 int 數組

[英]Spring-Boot REST API can't parse int array

我正在嘗試按照 hyperskill.org 的“Web Quiz Engine”項目創建一個簡單的 SpringBoot REST api。

但是 Solve 端點拒絕工作。

這是控制器:

@CrossOrigin(origins = "*")
@RestController
@RequestMapping("api")
@Validated
public class QuizController {

  //snip

  @PostMapping(value = "/quizzes/{id}/solve")
  public Result solveQuiz(@PathVariable Long id, @RequestBody int[] answer){
    return quizService.solveQuiz(id, answer);
  }
}

這是我的郵遞員: stackoverflow 不允許嵌入圖像

發布 http://localhost:8889/api/quizzes/1/solve?id=1

身體 *生

{
 "answer": [2]
}

和錯誤:

org.springframework.http.converter.HttpMessageNotReadableException:JSON 解析錯誤:無法從 Object 值(令牌 `JsonToken.START_OBJECT`)反序列化類型為 `[I` 的值; 嵌套異常是 com.fasterxml.jackson.databind.exc.MismatchedInputException:無法反序列化類型的值[I from Object value (token `JsonToken.START_OBJECT`)

當我運行提供的測試時,我得到了同樣的錯誤。 一切正常,直到它嘗試調用 Solve。 最令人困惑的是類型 `[I`。 到底是怎么回事?

編輯:嘗試遵循以下答案:

  @PostMapping(value = "/quizzes/{id}/solve")
  public Result solveQuiz(@PathVariable Long id, @Valid @RequestBody AnswerArray answer){
    return quizService.solveQuiz(id, answer.getAnswers());
  }

和答案數組:

@Data
public class AnswerArray {
  @NotNull
  private List<Integer> answers;
}

現在錯誤是:

已解決 [org.springframework.web.bind.MethodArgumentNotValidException:公共 engine.Entities.Result engine.Controller.QuizController.solveQuiz(java.lang.Long,engine.Entities.AnswerArray) 中的參數1驗證失敗:[對象中的字段錯誤'answers' 字段上的 'answerArray':拒絕值 [null]; 代碼 [NotNull.answerArray.answers,NotNull.answers,NotNull.java.util.List,NotNull]; 參數 [org.springframework.context.support.DefaultMessageSourceResolvable: 代碼 [answerArray.answers,answers]; 論據 []; 默認消息[答案]]; 默認消息 [不能為空]] ]

我還嘗試了帶有 int[] 和 Integer[] 的 AnswerArray,並且還得到了空值。 我錯過了什么?

好吧,您沒有發布int[]

這是你的身體:

{
    "answer": [
        2
    ]
}

這實際上是一個包含integers listObject

因此您的 Java 對象應如下所示:

// The class can be named whatever
public class Request {
    
    private List<Integer> answer;

    // constructor

    // getters and setters
}

該函數應如下所示:

public Result solveQuiz(@PathVariable Long id, @RequestBody Request answer){
    return quizService.solveQuiz(id, answer.getAnswer());
}

int[] 確實需要在一個類中,但另一個答案遺漏了一個關鍵信息:該類需要一個具有空主體的無參數構造函數。 默認構造函數有效,但如果您添加顯式構造函數(或使用 Lombok 的 @Data),則不再獲得默認構造函數。 所以添加一個默認構造函數似乎是我最終需要的(通過使用添加 Lombok 的@NoArgsConstructor)。 雖然我之前嘗試過,但是 Spring 缺乏有用的錯誤信息導致我在同時出現另一個問題時放棄了它。

總之,solveQuiz 需要將 int[] 包裹在一個對象中。 並且該對象需要一個空的無參數構造函數(或默認構造函數),以及 Getter 和 Setter。 (或龍目島@NoArgsConstructor)

所以這是我的包裝對象:

@Data
@NoArgsConstructor
public class AnswerArray {
  @NotNull
  private int[] answer;
}

和我的api函數:

  @PostMapping(value = "/quizzes/{id}/solve")
  public Result solveQuiz(@PathVariable Long id, @Valid @RequestBody AnswerArray answer){
    return quizService.solveQuiz(id, answer.getAnswer());
  }

問題也可能是 intellij 沒有正確編譯更改,“重建項目”最終可能是修復。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM