Skip to main content

Leitfaden zur Eingabevalidierung mit Spring Boot

Artikel von
Headshot of Lucien Chemaly

Lucien Chemaly

feature bean validation

12. September 2023

0 Min. Lesezeit
{"id":1,"name":"John Doe Updated","email":"john.doe.updated@example.com","password":"newP@ssW0rd!"}

Wenn Sie als Entwickler mit Java arbeiten, kennen Sie wahrscheinlich Spring Boot – ein leistungsstarkes Framework, das die Entwicklung eigenständiger, produktionsreifer Anwendungen auf Spring-Basis vereinfacht. Zu den zahlreichen Funktionen gehört Bean Validation, ein wichtiger Bestandteil jeder Anwendung, um die Datenintegrität sicherzustellen und die Benutzererfahrung zu verbessern.

Bean Validation lässt sich in Spring-Boot-Anwendungen zur Validierung von Eingaben und Formularen, zur Datenvalidierung vor dem Speichern in einer Datenbank sowie zur Durchsetzung verschiedener Sicherheitsrichtlinien einsetzen. Mit Bean Validation können Entwickler Fehler vermeiden, die Gesamtqualität der Anwendung verbessern und sicherstellen, dass die Daten in der gesamten Anwendung konsistent sind.

In diesem Artikel erfahren Sie mehr über die verschiedenen Einsatzmöglichkeiten von Bean Validation und wie Sie die Funktion in Spring Boot implementieren, um sie effektiv in Ihren eigenen Projekten einzusetzen.

Was ist Bean Validation?

Mit Bean Validation können Sie Einschränkungen für die Datenmodelle Ihrer Anwendung festlegen. So stellen Sie sicher, dass die Daten bestimmte Regeln erfüllen, bevor sie verarbeitet oder gespeichert werden. Dies wird durch die Integration der Jakarta Bean Validation ermöglicht, die eine Reihe von Annotationen und Schnittstellen zum Definieren und Überprüfen von Einschränkungen bereitstellt.

Durch den Einsatz von Bean Validation können Entwickler Zeit und Ressourcen sparen, indem sie Fehler und Inkonsistenzen früh im Entwicklungsprozess erkennen. Außerdem trägt Bean Validation zu einer besseren Benutzererfahrung bei, da weniger fehlerhafte Daten eingegeben werden.

Sehen wir uns einige gängige Anwendungsfälle für Bean Validation bei der Anwendungsentwicklung an:

Eingabe- und Formularvalidierung

Zu den häufigsten Anwendungsfällen von Bean Validation gehört die Validierung von Eingaben und Formularen. Damit lässt sich sicherstellen, dass Benutzer Daten im richtigen Format eingeben (z. B. bei der Validierung eines Registrierungsformulars mit E-Mail-Adressen, Benutzernamen und Passwörtern).

Datenvalidierung vor dem Speichern in einer Datenbank

Eine weitere Anwendung von Bean Validation ist die Validierung von Daten vor dem Speichern in einer Datenbank. So lässt sich sicherstellen, dass die eingegebenen Daten konsistent und korrekt sind. Das beugt Fehlern vor und verringert das Risiko einer Datenbeschädigung.

Durchsetzung von Sicherheitsrichtlinien

Bean Validation kann auch zur Durchsetzung von Sicherheitsrichtlinien eingesetzt werden. Dazu werden Benutzereingaben oder aus der Datenbank geladene Daten überprüft, um sicherzustellen, dass sie bestimmte Kriterien erfüllen, etwa Anforderungen an die Passwortstärke. Validierung spielt eine wichtige Rolle bei der Abwehr von Injection-Angriffen und hilft, Sicherheitslücken wie gespeichertes Cross-Site-Scripting (XSS) zu verhindern.

Validierung der Geschäftslogik

Bean Validation lässt sich zur Überprüfung der Geschäftslogik einsetzen und stellt sicher, dass bestimmte Anforderungen oder Standards erfüllt werden. Durch definierte Validierungsregeln, etwa zur Passwortkomplexität oder zu zulässigen Mengen und Preisen von Bestellpositionen, kann Bean Validation Daten automatisch prüfen und die erforderlichen Regeln durchsetzen. Dadurch entfällt die manuelle Prüfung, und die Anwendung erfüllt die festgelegten Standards und Anforderungen.

Bean Validation in Spring Boot implementieren

In diesem Tutorial implementieren Sie Bean Validation für eine einfache CRUD-Anwendung (Create, Read, Update, Delete) mit einer In-Memory-Datenbank. Benutzer geben ihren Namen, ihre E-Mail-Adresse und ihr Passwort an. Diese Angaben müssen bestimmte Kriterien erfüllen, um akzeptiert zu werden. Die hier verwendete High-Level-Architektur besteht aus einem Backend-Server mit RESTful-APIs und einer H2-In-Memory-Datenbank.

Wenn eine Clientanwendung den Webservice aufruft (also die Anwendung aus diesem Tutorial), wird die Anfrage an den UserController. gesendet. Anschließend validiert der Controller die Anfragedaten. Sind die Daten gültig, wird die Anfrage an das UserRepository weitergeleitet, das mit der In-Memory-Datenbank kommuniziert und die entsprechende Antwort zurückgibt. Andernfalls sind die Daten ungültig, und die Anfrage wird mit einer Fehlermeldung an den Client zurückgesendet:

Flussdiagramm, das zeigt, wie eine Client-Anfrage die Bean-Validierung im UserController durchläuft und an das UserRepository weitergeleitet wird – mit einem Pfad für gültige Anfragen und einem für Validierungsfehler.

Voraussetzungen

Bevor Sie mit der Implementierung beginnen, stellen Sie sicher, dass die folgenden Tools und Technologien installiert sind:

Ein neues Spring-Boot-Projekt erstellen

Um ein neues Spring-Boot-Projekt zu erstellen, rufen Sie den Spring Initializr auf und wählen Sie die folgenden Optionen aus:

  • Projekttyp: Maven Project

  • Sprache: Java

  • Paketierung: Jar

  • Java-Version: 17

  • Spring Boot: 3.1.0 (SNAPSHOT)

Geben Sie im Abschnitt Project Metadata die folgenden Angaben ein:

  • Gruppe: com.example

  • Artefakt: simple-crud-bean-validation

  • Name: simple-crud-bean-validation

  • Beschreibung: Eine einfache CRUD-Anwendung mit Spring Boot

  • Paketname: com.example.simplecrud

Fügen Sie außerdem die folgenden Abhängigkeiten hinzu:

  • Web: Spring Web

  • Validierung: Bean Validation

  • H2 Database: H2 Database

  • Spring Data JPA: Spring Data and Hibernate

Spring-Initializr-Konfiguration mit einem Java-Spring-Boot-CRUD-Projekt und den Abhängigkeiten Bean Validation, H2 Database, Spring Data JPA und Spring Web

Klicken Sie auf Generate, um das Projekt als ZIP-Datei herunterzuladen. Entpacken Sie die ZIP-Datei anschließend und importieren Sie das Projekt in Ihre bevorzugte IDE.

Die Anwendung implementieren

Wir verwenden die Standardprojektstruktur für Spring-Boot-Anwendungen. Hier sehen Sie die vollständige Projektstruktur:

Projektverzeichnisstruktur einer einfachen CRUD-Anwendung zur Bean-Validierung mit Java-Quellcode, Model, Repository, Controller, Tests und Maven-Dateien.

User-Modell

Erstellen Sie zunächst zum Implementieren der Anwendung das Verzeichnis model unter src/main/java/com/example/simplecrudbeanvalidation. Erstellen Sie dann im Verzeichnis model eine Datei namens User.java und fügen Sie der User-Klasse die folgenden Felder und Bean-Validation-Annotationen hinzu:

import jakarta.persistence.*;
import jakarta.validation.constraints.*;

@Entity
@Table(name="users")
public class User {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @NotNull
    @NotEmpty
    @Pattern(regexp = "[a-zA-Z0-9 ]")
    private String name;

    @NotNull
    @NotEmpty
    @Email
    @Pattern(regexp=".+@.+\\..+")
    private String email;

    @NotNull
    @NotEmpty
    @Size(min = 8, max = 64)
    private String password;

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public User(Long id, String name, String email, String password){
        this.id = id;
        this.name = name;
        this.email = email;
        this.password = password;
    }

    //default constructor
    public User(){}
}

Dieser Code definiert eine Java-Klasse namens User, die mithilfe von Annotationen der Jakarta Persistence API (JPA) eine Datenbanktabelle namens users abbildet. Die Klasse enthält vier Instanzvariablen – id, name, email und password – mit den entsprechenden Gettern und Settern. Für jedes dieser Felder gelten bestimmte Validierungsregeln, etwa @NotNull, @NotEmpty, @Email, @Size und @Pattern. Mit @Pattern wird festgelegt, dass das Passwort acht bis 64 Zeichen lang sein und mindestens eine Ziffer, einen Kleinbuchstaben, einen Großbuchstaben und ein Sonderzeichen enthalten muss. Außerdem wird @Pattern für die Eigenschaft name verwendet, um Script-Injection zu verhindern. Die Klasse dient als Modell zum Speichern und Abrufen von Benutzerdaten in einer Datenbank.

User-Repository

Erstellen Sie für CRUD-Vorgänge mit einer In-Memory-Datenbank das Verzeichnis repository unter src/main/java/com/example/simplecrudbeanvalidation. Erstellen Sie dann im Verzeichnis directory eine Datei namens UserRepository.java, in der Sie die Schnittstelle UserRepository wie folgt definieren:

import com.example.simplecrudbeanvalidation.model.User;
import org.springframework.data.repository.CrudRepository;
import org.springframework.stereotype.Repository;

@Repository
public interface UserRepository extends CrudRepository<User, Long> {
}

Dieser Code definiert eine Java-Schnittstelle namens UserRepository, die die von Spring Data JPA bereitgestellte Schnittstelle CrudRepository erweitert. Die Schnittstelle UserRepository legt zwei generische Parameter für CrudRepository fest: User als Entitätstyp, den dieses Repository verwaltet, und Long als Typ des Primärschlüssels der Entität.

Durch die Erweiterung von CrudRepository erbt UserRepository mehrere Methoden für CRUD-Vorgänge mit der Entität User. Mit diesen Methoden können Sie mit einer In-Memory-Datenbank interagieren und User-Objekte verwalten, ohne eine komplexe Konfiguration oder einen vollwertigen Datenbankserver zu benötigen.

User-Controller

Erstellen Sie zunächst im Verzeichnis src/main/java/com/example/simplecrudbeanvalidation ein Verzeichnis namens controller, um die Klasse UserController mit den RESTful-API-Endpunkten und der Validierungslogik anzulegen. Erstellen Sie im Verzeichnis controller eine Datei namens UserController.java mit folgendem Inhalt:

import com.example.simplecrudbeanvalidation.model.User;
import com.example.simplecrudbeanvalidation.repository.UserRepository;
import jakarta.validation.Valid;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.ResponseEntity;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import java.util.List;
import java.util.Optional;

@RestController
@RequestMapping("/api/users")
@Validated
public class UserController
{
   @Autowired
   private UserRepository userRepository;

   @GetMapping
   public List<User> getAllUsers() {
       return (List<User>) userRepository.findAll();
   }

   @GetMapping("/{id}")
   public ResponseEntity<User> getUserById(@PathVariable Long id) {
       Optional<User> userOptional = userRepository.findById(id);
       if (userOptional.isPresent()) {
           return ResponseEntity.ok(userOptional.get());
       } else {
           return ResponseEntity.notFound().build();
       }
   }

   @PostMapping
   public User createUser(@Valid @RequestBody User user) {
       return userRepository.save(user);
   }

   @PutMapping("/{id}")
   public ResponseEntity<User> updateUser(@PathVariable Long id, @Valid @RequestBody User updatedUser) {
       Optional<User> userOptional = userRepository.findById(id);
       if (userOptional.isPresent()) {
           User user = userOptional.get();
           user.setName(updatedUser.getName());
           user.setEmail(updatedUser.getEmail());
           user.setPassword(updatedUser.getPassword());
           userRepository.save(user);
           return ResponseEntity.ok(user);
       } else {
           return ResponseEntity.notFound().build();
       }
   }

   @DeleteMapping("/{id}")
   public ResponseEntity<Void> deleteUser(@PathVariable Long id) {
       if (userRepository.existsById(id)) {
           userRepository.deleteById(id);
           return ResponseEntity.ok().build();
       } else {
           return ResponseEntity.notFound().build();
       }
   }
}

Dieser Code definiert eine Spring-Boot-RestController-Klasse namens UserController, die HTTP-Anfragen zur Verwaltung von User-Objekten verarbeitet. Die Klasse enthält fünf Methoden für verschiedene HTTP-Anfragen: alle Benutzer abrufen, einen einzelnen Benutzer anhand seiner ID abrufen, einen neuen Benutzer erstellen, einen vorhandenen Benutzer aktualisieren und einen Benutzer löschen.

Mit der Annotation @Autowired wird die Abhängigkeit UserRepository in die Klasse UserController eingefügt. Die Klasse UserController ist über die Annotation @RequestMapping dem Endpunkt /api/users zugeordnet. Damit werden eingehende HTTP-Anfragen an diesen Controller weitergeleitet. Außerdem aktiviert die Annotation @Validated die Validierung von Anfrageparametern. Insgesamt stellt dieser Code eine RESTful-API für CRUD-Vorgänge mit User-Objekten bereit, die Spring Data und eine In-Memory-Datenbank verwendet.

In-Memory-Datenbank konfigurieren

Öffnen Sie zum Konfigurieren der In-Memory-Datenbank die Datei application.properties unter src/main/resources/ und fügen Sie die folgenden Konfigurationen hinzu:

spring.datasource.url=jdbc:h2:mem:testdb
spring.datasource.driverClassName=org.h2.Driver
spring.datasource.username=sa
spring.datasource.password=
spring.jpa.database-platform=org.hibernate.dialect.H2Dialect

Diese Spring-Boot-Konfiguration richtet eine H2-In-Memory-Datenbank namens testdb ein und konfiguriert deren Treiber, Benutzernamen und Passwort. Außerdem wird der H2-Dialekt für Hibernate-basierte Datenbankvorgänge festgelegt.

H2 wird für den Produktiveinsatz nicht empfohlen

Die Verwendung von H2 als Produktivdatenbank wird nicht empfohlen. Auch der Standardbenutzername und das Standardpasswort sollten nicht in einer Produktionsumgebung verwendet werden. Diese Konfiguration eignet sich zwar für Demos, sollte aber nicht im Produktivbetrieb eingesetzt werden.

Unit-Tests für Bean Validation

Sobald Sie die In-Memory-Datenbank konfiguriert haben, können Sie mit Unit-Tests für Bean Validation beginnen. Erstellen Sie dazu das Verzeichnis controller unter src/test/java/com/example/simplecrudbeanvalidation. Erstellen Sie dann im Verzeichnis controller eine Datei namens UserControllerTest.java und schreiben Sie Tests, um zu überprüfen, ob die Bean-Validation-Regeln wie erwartet funktionieren.

Fügen Sie der Klasse UserControllerTest den folgenden Code hinzu:

import com.example.simplecrudbeanvalidation.model.User;
import com.example.simplecrudbeanvalidation.repository.UserRepository;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.boot.test.mock.mockito.MockBean;
import org.springframework.http.MediaType;
import org.springframework.test.web.servlet.MockMvc;
import java.util.Arrays;
import java.util.Optional;
import static org.hamcrest.Matchers.hasSize;
import static org.mockito.Mockito.*;
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*;

@SpringBootTest
@AutoConfigureMockMvc
public class UserControllerTest {

    @Autowired
    private MockMvc mockMvc;

    @MockBean
    private UserRepository userRepository;

    @Autowired
    private ObjectMapper objectMapper;

    @Test
    public void createUser_validData_success() throws Exception {
        User newUser = new User(null, "John Doe", "john.doe@example.com", "p@ssW0rd!");
        User savedUser = new User(1L, newUser.getName(), newUser.getEmail(), newUser.getPassword());

        when(userRepository.save(any(User.class))).thenReturn(savedUser);

        mockMvc.perform(post("/api/users")
                        .contentType(MediaType.APPLICATION_JSON)
                        .content(objectMapper.writeValueAsString(newUser)))
                .andExpect(status().isOk())
                .andExpect(jsonPath("$.id").value(savedUser.getId()))
                .andExpect(jsonPath("$.name").value(savedUser.getName()))
                .andExpect(jsonPath("$.email").value(savedUser.getEmail()))
                .andExpect(jsonPath("$.password").value(savedUser.getPassword()));
    }

    @Test
    public void createUser_invalidData_failure() throws Exception {
        User invalidUser = new User(null, "", "invalid-email", "123");

        mockMvc.perform(post("/api/users")
                        .contentType(MediaType.APPLICATION_JSON)
                        .content(objectMapper.writeValueAsString(invalidUser)))
                .andExpect(status().isBadRequest());
    }

    @Test
    public void getAllUsers() throws Exception {
        User user1 = new User(1L, "John Doe", "john.doe@example.com", "p@ssW0rd!");
        User user2 = new User(2L, "Jane Doe", "jane.doe@example.com", "p@ssW0rd!");
        when(userRepository.findAll()).thenReturn(Arrays.asList(user1, user2));
        mockMvc.perform(get("/api/users"))
                .andExpect(status().isOk())
                .andExpect(jsonPath("$", hasSize(2)))
                .andExpect(jsonPath("$[0].id").value(user1.getId()))
                .andExpect(jsonPath("$[0].name").value(user1.getName()))
                .andExpect(jsonPath("$[0].email").value(user1.getEmail()))
                .andExpect(jsonPath("$[0].password").value(user1.getPassword()))
                .andExpect(jsonPath("$[1].id").value(user2.getId()))
                .andExpect(jsonPath("$[1].name").value(user2.getName()))
                .andExpect(jsonPath("$[1].email").value(user2.getEmail()))
                .andExpect(jsonPath("$[1].password").value(user2.getPassword()));
    }

    @Test
    public void getUserById_found() throws Exception {
        User user = new User(1L, "John Doe", "john.doe@example.com", "p@ssW0rd!");
        when(userRepository.findById(user.getId())).thenReturn(Optional.of(user));
        mockMvc.perform(get("/api/users/{id}", user.getId()))
                .andExpect(status().isOk())
                .andExpect(jsonPath("$.id").value(user.getId()))
                .andExpect(jsonPath("$.name").value(user.getName()))
                .andExpect(jsonPath("$.email").value(user.getEmail()))
                .andExpect(jsonPath("$.password").value(user.getPassword()));
    }

    @Test
    public void getUserById_notFound() throws Exception {
        Long userId = 1L;
        when(userRepository.findById(userId)).thenReturn(Optional.empty());
        mockMvc.perform(get("/api/users/{id}", userId))
                .andExpect(status().isNotFound());
    }
}

Dieser Code enthält eine Reihe von JUnit-Tests für die Klasse UserController. Die Tests verwenden die Klasse MockMvc, um HTTP-Anfragen an den Endpunkt /api/users zu simulieren und zu überprüfen, ob die entsprechenden Methoden in der Klasse UserController diese korrekt verarbeiten. Die Tests decken unter anderem folgende Szenarien ab: Erstellen eines neuen Benutzers mit gültigen und ungültigen Daten, Abrufen aller Benutzer sowie Abrufen eines Benutzers anhand seiner ID, sowohl wenn der Benutzer vorhanden ist als auch wenn nicht.

Mit der Annotation @SpringBootTest wird der Anwendungskontext geladen. Die Annotation @MockBean dient dazu, die Abhängigkeit UserRepository der Klasse UserController zu simulieren. Insgesamt stellen diese Tests sicher, dass die Klasse UserController korrekt funktioniert und angemessen auf verschiedene HTTP-Anfragen reagiert.

Öffnen Sie zum Ausführen der Tests ein Terminal oder eine Shell, wechseln Sie in das Stammverzeichnis Ihres Projekts und führen Sie den folgenden Befehl aus:

mvn test

Sie sollten sehen, dass alle Tests erfolgreich durchlaufen wurden:

…output omitted…
[INFO] Results:
[INFO] 
[INFO] Tests run: 5, Failures: 0, Errors: 0, Skipped: 0
[INFO] 
[INFO] ------------------------------------------------------------------------
…output omitted…

APIs ausführen und testen

Klicken Sie in IntelliJ mit der rechten Maustaste auf die Datei SimpleCrudBeanValidationApplication.java und wählen Sie Run 'SimpleCrudBeanValidationApplication.main()' aus:

IntelliJ IDEA zeigt eine Java-User-Klasse mit Bean-Validation-Annotationen und ein Kontextmenü, in dem die Option zum Ausführen der Anwendung hervorgehoben ist.

Alternativ können Sie Ihre Anwendung im Terminal oder in der Shell mit den folgenden Befehlen ausführen:

mvn clean install
java -jar target/simple-crud-bean-validation-0.0.1-SNAPSHOT.jar

Nach dem Start der Spring-Boot-Anwendung können Sie die CRUD-Vorgänge mit curl-Befehlen im Terminal oder in der Shell testen. Das entspricht dem Aufruf dieser APIs durch eine Frontend-Anwendung oder Postman.

Beginnen Sie zum Testen der CRUD-Vorgänge damit, einen Benutzer anzulegen:

curl -X POST -H "Content-Type: application/json" -d '{"name":"John Doe","email":"john.doe@example.com","password":"p@ssW0rd!"}' http://localhost:8080/api/users

Die Ausgabe sieht dann so aus:

{"id":1,"name":"John Doe","email":"john.doe@example.com","password":"p@ssW0rd!"} 

Rufen Sie anschließend alle Benutzer ab:

curl -X GET http://localhost:8080/api/users

Die Ausgabe sieht dann so aus:

{"id":1,"name":"John Doe","email":"john.doe@example.com","password":"p@ssW0rd!"}

Rufen Sie als Nächstes Ihren Benutzer anhand der ID ab. Ersetzen Sie <id> durch die ID des Benutzers, den Sie abrufen möchten:

curl -X GET http://localhost:8080/api/users/<id>

Die Ausgabe sieht dann so aus:

{"id":1,"name":"John Doe","email":"john.doe@example.com","password":"p@ssW0rd!"}

Aktualisieren Sie den Benutzer, indem Sie <id> durch die ID des Benutzers ersetzen, den Sie aktualisieren möchten:

curl -X PUT -H "Content-Type: application/json" -d '{"name":"John Doe Updated","email":"john.doe.updated@example.com","password":"newP@ssW0rd!"}' http://localhost:8080/api/users/<id>

Die Ausgabe sieht dann so aus:

{"id":1,"name":"John Doe Updated","email":"john.doe.updated@example.com","password":"newP@ssW0rd!"}

Löschen Sie anschließend einen Benutzer, indem Sie <id> durch die ID des Benutzers ersetzen, den Sie löschen möchten:

curl -X DELETE http://localhost:8080/api/users/<id>

Dieser Befehl gibt keine Ausgabe zurück.

Mit diesen curl-Befehlen können Sie die CRUD-Operationen Ihrer User-RESTful-API testen. Denken Sie daran, <id> in jedem Befehl durch die entsprechende User-ID zu ersetzen. Wenn Sie diese Schritte ausführen, können Sie mit Ihrer Spring-Boot-Anwendung interagieren und überprüfen, ob die Bean-Validation-Bedingungen zur Laufzeit wie erwartet funktionieren.

Wenn Sie diese curl-Anfragen erneut mit ungültigen Einträgen ausführen, etwa mit einer ungültigen E-Mail-Adresse, einem ungültigen Passwort oder leeren Werten, gibt die API einen Fehler wegen einer fehlerhaften Anfrage zurück. Diese Fehlermeldung zeigt an, dass die Validierung auf Controller-Ebene, auch als Bean Validation bekannt, nicht erfolgreich war.

Sehen wir uns einige Beispiele für fehlerhafte Anfragen an. Hier erstellen Sie einen Benutzer mit einer ungültigen E-Mail-Adresse:

curl -X POST -H "Content-Type: application/json" -d '{"name":"John Doe","email":"johexample","password":"p@ssW0rd!"}' http://localhost:8080/api/users

Die Ausgabe sieht folgendermaßen aus:

{"timestamp":"2023-03-28T10:27:21.884+00:00","status":400,"error":"Bad Request","path":"/api/users"}

Und hier erstellen Sie einen Benutzer mit einem ungültigen Passwort:

curl -X POST -H "Content-Type: application/json" -d '{"name":"John Doe","email":"joh@example.com","password":"test"}' http://localhost:8080/api/users

Die Ausgabe sieht folgendermaßen aus:

{"timestamp":"2023-03-28T10:29:30.793+00:00","status":400,"error":"Bad Request","path":"/api/users"}

Fazit zur Validierung

In diesem Artikel haben Sie erfahren, wie Sie Bean Validation in Spring Boot in einer einfachen CRUD-Anwendung implementieren. Sie haben mit Spring Initializr ein Projekt erstellt, die erforderlichen Abhängigkeiten hinzugefügt und ein User-Modell mit Bean-Validation-Annotationen implementiert. Außerdem haben Sie ein UserRepository und einen UserController mit RESTful-API-Endpunkten implementiert, die Bean Validation nutzen, und Tests geschrieben, um zu überprüfen, ob die Bean-Validation-Bedingungen wie erwartet funktionieren.

Um die Sicherheit Ihrer Anwendung weiter zu verbessern, verwenden Sie Snyk Code, ein SAST-Tool, das unsichere Code-Muster erkennt, die zu Injection-Angriffen führen können. Mit der Erweiterung Snyk Security plugin for IntelliJ IDE können Sie diese Analyse in Ihren Entwicklungs-Workflow integrieren.

Nachdem Sie nun wissen, wie Bean Validation in Spring Boot funktioniert, können Sie sie in Ihren eigenen Projekten implementieren, die Datenintegrität sicherstellen und die Benutzererfahrung verbessern. Den fertigen Code finden Sie im folgenden GitHub-Repository.

Starten Sie mit Capture the Flag

Erfahren Sie in unserem virtuellen On-Demand-Workshop für Einsteiger, wie Sie Capture-the-Flag-Herausforderungen lösen.

Gepostet in:

Weiterlesen

blog feature snyk container custom base recommendations
Blog

Evo Agentic AppSec: Sicherheit, die mit der KI-Entwicklung Schritt hält

KI-gestützte Entwicklung ist schneller als herkömmliche Sicherheitsabläufe. Snyks Agentic AppSec setzt Sicherheitsagenten ein, um Schwachstellen kontinuierlich zu finden, zu beheben und zu überprüfen – während Menschen die Maßstäbe festlegen.

feature insights context
Blog

Autonome Angriffe sind bereits Realität. Die Verteidigung muss Schritt halten.

Autonome Angreifer verkürzen das Zeitfenster für die Verteidigung. Erfahren Sie, wie kontinuierliches Erkennen, Beheben, Validieren und Verhindern Sicherheitsteams helfen kann, Schritt zu halten.

illustration hero ai
Blog

Der KI-Hurrikan ist da

KI beschleunigt gleichermaßen die Softwareentwicklung und Cyberangriffe. Führungskräfte müssen Agents und Code von Anfang an absichern, zur Laufzeit Kontrollen durchsetzen und Abwehrmaßnahmen unabhängig validieren.