[英]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
list
的Object
因此您的 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.