似乎在 React 应用程序中将 playerId 参数从前端传递到后端时出现问题。 Spring 控制器中的 createGame 函数设置为接收 playerId 参数,但该值未使用 Axios 从前端正确传递。已尝试对 playerId 使用 Long 和 String,但问题仍然存在。 仍在获得状态 400!
Daniel 的回答 是正确的,但我这样重写代码:
@PostMapping("/games")
public ResponseEntity<String> createGame(@RequestBody Map<String, Object> requestParams) {
try {
Long playerId = Long.parseLong(requestParams.get("playerId").toString());
LocalDateTime now = LocalDateTime.now();
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss");
String gameCreated = now.format(formatter);
Player player = playerRepository.findById(playerId).orElse(null);
if (player == null) {
return ResponseEntity.notFound().build();
}
Game game = new Game(gameCreated);
gameRepository.save(game);
GamePlayer gamePlayer = new GamePlayer(game, player);
gamePlayerRepository.save(gamePlayer);
return ResponseEntity.ok("Game created successfully!");
} catch (Exception e) {
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body("Failed to create game.");
}
}
React 将像这样发送:
const handleClick = async () => {
try {
const response = await axios.post(`/api/games?playerId=${parseInt(storedPlayerId)}`);
console.log(response.data);
} catch (error) {
console.log(error.response.data);
// handle the error
}
};
在共享的 React 屏幕截图中 - 看起来您发送了一个 JSON 正文。
但是,在 Spring Controller 中 - 使用@RequestParam。
看起来您要么需要更改 React 部分以调用类似“/api/games/{playerId}”的 URL(因此 playerId 将作为 URL 的一部分传递)或更新 Spring Controller 以接受 @RequestBody(并创建一个类field 'playerId') - 所以整个对象可以作为请求主体传递。
目前 React 发送一个主体——但是 Spring 正在寻找一个 URL 查询参数。两个部分都需要做同样的事情——不管它是什么。
春天的变化看起来像:
public ResponseEntity<String> createGame(@RequestBody PlayerRequest playerRequest) {
Long playerId = playerRequest.getPlayerId();
// other code goes here
}
public class PlayerRequest {
private Long playerId;
public Long getPlayerId() {
return playerId;
}
public void setPlayerId(Long playerId) {
this.playerId = playerId;
}
}