Code: Select all
public record VideoGame(
@Positive
Integer id,
@NotEmpty
String title,
@NotEmpty
String console,
@NotEmpty
String genre,
String publisher,
String developer,
Double critic_score,
Double other_sales,
LocalDate release_date,
LocalDate last_update
) { }
Code: Select all
@Repository
public class VideoGameRepository {
private final JdbcClient jdbcClient;
public VideoGameRepository(JdbcClient jdbcClient) {
this.jdbcClient = jdbcClient;
}
public void create(VideoGame videoGame) {
var newVideoGame = jdbcClient.sql("INSERT INTO videogamesalestest (id, title, console, genre, publisher, developer, critic_score, release_date, last_update)" +
"VALUES(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)")
.param(List.of(videoGame.id(), videoGame.title(), videoGame.console(), videoGame.genre(), videoGame.publisher(), videoGame.developer(), videoGame.critic_score(), videoGame.release_date(), videoGame.last_update()))
.update();
Assert.state(newVideoGame == 1, "Failed to insert new videoGame");
}
}
Code: Select all
@RestController
@RequestMapping("/api/videogames")
public class VideoGameController {
private final VideoGameRepository videoGameRepository;
public VideoGameController(VideoGameRepository videoGameRepository) {
this.videoGameRepository = videoGameRepository;
}
@ResponseStatus(HttpStatus.CREATED)
@PostMapping("")
void create(@RequestBody VideoGame videoGame) {
videoGameRepository.create(videoGame);
}
}
Ich habe es versucht Setzen Sie einfach den Feldwert im JSON-Body als solchen auf Null und senden Sie dann die Anfrage:
Code: Select all
{
"id": 1,
"title": "NewGame",
"console": "Xbox",
"genre": "Action",
"publisher": "CBGAMES",
"developer": "CBGAMES",
"critic_score": 10.0,
"release_date": "2025-01-07",
"last_update": null
}
Ich habe auch versucht, die Felder im Datensatz mit @Nullable zu kommentieren. aber ich erhalte im Repository eine Warnung, dass das Argument möglicherweise null ist.
Was kann ich tun, um dies zu erreichen? Muss ich eine Klasse anstelle eines Datensatzes erstellen, um Nullwerte zu verarbeiten, oder gibt es eine „springigere“ Möglichkeit, dies zu erreichen? Ich habe auch darüber nachgedacht, Optionals zu verwenden, habe aber gelesen, dass dies nicht wirklich das ist, was Optionale erreichen sollen. Ich möchte den Client auch nicht daran hindern, einen vollständigen Datensatz einzureichen, da dies in meinem Fall keinen Sinn ergibt.
Update: Meine Frage wurde gelöst. Das Hauptproblem, mit dem ich konfrontiert war (ohne die syntaktischen Probleme mit meinem Code zu ignorieren), war, wie ich zulassen kann, dass Nullwerte oder fehlende Werte von meinem Anforderungstext übergeben und in ein VideoGame-Objekt deserialisiert werden. Die Lösung bestand darin, den Aufruf von List.of() in meinem params()-Aufruf zu entfernen. Die List.of()-API gibt eindeutig an, dass sie eine NullPointException auslöst, wenn ein Element null ist. Die Lösung bestand darin, List.of() zu entfernen und nur die Parameter zu übergeben. Interessanterweise musste ich nicht einmal die Datensatzfelder mit @Nullable versehen, und ich brauchte @Valid nicht in meinem Controller.