Spring Bean Validation

spring-icon

Seit vorgestern steht der erste Release Candidate vom Spring Framework zum Download bereit.
In dieser Version werden erstmalig der JSR-303 (Bean Validation) und JSR-330 (Dependency Injection in Java) unterstützt. Besonders auf die Umsetzung der Bean Validation war ich gespannt, denn dadurch kann man über Annotations seine Beans mit Constraints versehen.

In einer Spring basierten Web Anwendung könnte man die Bean Validation wie folgt nutzen.

1. annotieren der Bean

public class Event {
   int id;
   
   @NotNull
   @Size(min=1,max=50)
   String description;
...

Durch die zwei Annotations (in validation-api-1.0.CR3.jar enthalten) wird festgelegt, dass der Wert für das Attribut description nicht null sein darf und minimum 1 Zeichen aber maximal 50 Zeichen enthalten muss.

2. validieren der Bean innerhalb des Controllers

Zur Validierung benötigt man eine Implementierung des JSR-303, wie z.B. den Hibernate Validator (momentan in Version 4.0.0 CR1). Der hat allerdings eine Menge Abhängigkeiten und muss erst über Maven kompiliert werden.
Hat man diese Hürde genommen (und hat die daraus resultierende Jar Datei in sein Projekt eingebunden), benötigt man noch folgende Bibliotheken um keine Runtime Fehler zu produzieren:

  • validation-api-1.0.CR3.jar
  • slf4j-api-1.5.6.jar
  • slf4j-log4j12-1.5.6.jar
  • log4j-1.2.14.jar
  • commons-logging-1.0.4.jar (benötigt man nicht unbedingt, wurde aber im Beispiel verwendet)

diese liegen dann aber sowieso im lokalen Maven Repository vor.

@RequestMapping(value="/event/save", method=RequestMethod.POST)
public String save(Event event,BindingResult bindingResult, Model model) {
   LocalValidatorFactoryBean validator = new LocalValidatorFactoryBean();
   validator.setProviderClass(HibernateValidationProvider.class);
   validator.afterPropertiesSet();
   
   validator.validate(event,bindingResult);
   
   if (!bindingResult.hasErrors()) {
      // save ...
      model.addAttribute("message", "update successfully");         
   } else {
      for (FieldError e : bindingResult.getFieldErrors()) {
         log.warn(e.getField()+": "+e.getDefaultMessage());            
      }
      model.addAttribute("errors", bindingResult.getFieldErrors());
   }
   model.addAttribute("event", event);
   
   return "update";
}

In den Zeilen 3-5 Wird eine Instanz des Hibernate Validators erzeugt. In Zeile 7 wird dann endlich validiert. Ob bei der Validierung Fehler aufgetreten sind kann man mit der Methode hasErrors() überprüfen (Zeile 9). Zugriff auf alle Fehler (z.B. zum Loggen) erhält man über die Methode getFieldErrors() (Zeile 13-15).
In Zeile 16 werden die Fehler der View übergeben.

3. Ausgabe der Fehler in der View

Zur Ausgabe der Fehler wird die JSP Standard Tag Library verwendet.

${message}

  • ${error.field}: ${error.defaultMessage}

Kommentar verfassen

Trage deine Daten unten ein oder klicke ein Icon um dich einzuloggen:

WordPress.com-Logo

Du kommentierst mit Deinem WordPress.com-Konto. Abmelden /  Ändern )

Twitter-Bild

Du kommentierst mit Deinem Twitter-Konto. Abmelden /  Ändern )

Facebook-Foto

Du kommentierst mit Deinem Facebook-Konto. Abmelden /  Ändern )

Verbinde mit %s

%d Bloggern gefällt das: