Printemps de Démarrage de la liaison et de la validation de la gestion d'erreur dans le contrôleur REST

Quand j'ai le modèle suivant avec la JSR-303 (framework de validation) annotations:

public enum Gender {
    MALE, FEMALE
}

public class Profile {
    private Gender gender;

    @NotNull
    private String name;

    ...
}

et suivants de données JSON:

{ "gender":"INVALID_INPUT" }

Dans mon REPOS contrôleur, je veux gérer à la fois l'erreur de liaison (invalide valeur d'enum pour gender à la propriété) et les erreurs de validation (name propriété ne peut pas être null).

Le contrôleur suivant la méthode ne fonctionne PAS:

@RequestMapping(method = RequestMethod.POST)
public Profile insert(@Validated @RequestBody Profile profile, BindingResult result) {
    ...
}

Cela donne com.fasterxml.jackson.databind.exc.InvalidFormatException la sérialisation d'erreur avant de liaison ou de validation.

Après quelques tripoter, je suis venu avec ce code personnalisé qui fait ce que je veux:

@RequestMapping(method = RequestMethod.POST)
public Profile insert(@RequestBody Map values) throws BindException {

    Profile profile = new Profile();

    DataBinder binder = new DataBinder(profile);
    binder.bind(new MutablePropertyValues(values));

    //validator is instance of LocalValidatorFactoryBean class
    binder.setValidator(validator);
    binder.validate();

    //throws BindException if there are binding/validation
    //errors, exception is handled using @ControllerAdvice.
    binder.close(); 

    //No binding/validation errors, profile is populated 
    //with request values.

    ...
}

Fondamentalement, ce que ce code n'est sérialiser un générique carte au lieu de modèle, puis utiliser le code personnalisé à se lier à des modèle et vérifier les erreurs.

J'ai les questions suivantes:

  1. Est le code personnalisé à la manière d'aller ici ou est-il plus standard de la manière de le faire au Printemps de Démarrage?
  2. Comment le @Validated annotation de travail? Comment puis-je faire mes propres annotations personnalisées qui fonctionne comme @Validated pour encapsuler mon custom code de liaison?

OriginalL'auteur Jaap van Hengstum | 2016-01-11