Wie erlaube ich Nullwerte in einem POST-Anfragetext? Java und Spring FrameworkJava

Java-Forum
Guest
 Wie erlaube ich Nullwerte in einem POST-Anfragetext? Java und Spring Framework

Post by Guest »

Ich habe einen Videospiel-Datensatz:

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
) { }
Ein Videospiel-Repository:

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");
}
}
und einen Controller dafür:

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 möchte dem Client erlauben, eine POST-Anfrage zu senden, die möglicherweise alle Felder eines Videospieldatensatzes enthält oder nicht.
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
}
aber ich erhalte eine Status-500-Antwort „Interner Serverfehler“.
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.

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post