J'ai la méthode suivante dans mon contrôleur:
[Field error in object 'user' on field 'alias': rejected value [null]; codes [NotEmpty.user.alias,NotEmpty.alias,NotEmpty.java.lang.String,NotEmpty]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [user.alias,alias]; arguments []; default message [alias]]; default message [must not be empty]]
Et mon entité utilisateur spécifie:
org.springframework.validation.BeanPropertyBindingResult: 0 errors User(id=null, email=null, password=null, enabled=false, firstName=null, lastName=null, fullName=null null, alias=null, roles=[], links=[]) user saved!
Maintenant si je fais un simple post request (j'utilise le client Advanced REST pour l'extension chrome) J'obtiens:
@NonNull @Column(nullable = false, unique = true) @Valid public String alias;
Où il semble valider malgré l'alias @NonNull étant nul.
Si je change @NonNull en @NotEmpty
Alors la validation fonctionne comme prévu:
@PostMapping("/register") public String registerNewUser(@Valid User user, BindingResult result, Model model, RedirectAttributes redirectAttributes) { System.out.println(result); System.out.println(user); if(result.hasErrors()) { System.out.println("***ERROR***"); System.out.println(result.getAllErrors()); return result.getAllErrors().toString(); } else { //userRepository.save(user); System.out.println("user saved!"); return "user saved!"; } }
MAIS ce que je ne comprends pas, c'est pourquoi @NonNull autorise les Nulls?
3 Réponses :
Il n'y a pas d'annotation @NonNull
dans l'API de validation JSR-303. L'annotation s'appelle @NotNull
. Assurez-vous que vous utilisez réellement l'annotation javax.validation.constraints.NotNull
pour marquer le champ.
Vous devez utiliser NotNull
du package javax.validation et non de lombok (ceux-ci doivent être supprimés, lorsque java commence à prendre en charge la validation - voir ici ). Il valide les beans. Plus d'informations ici . Vous pouvez également utiliser le @NotNull
de hibernate depuis org.hibernate.validator. Cela fait également la validation.
@NotNull:
L'élément annoté ne doit pas être nul.Accepte tout type
@NotEmpty:
L'élément annoté ne doit pas être nul ni vide. Les types pris en charge sont:
- CharSequence (la longueur de la séquence de caractères est évaluée)
- Collection (la taille de la collection est évaluée)
- Carte (la taille de la carte est évaluée)
- Tableau (la longueur du tableau est évaluée)
@NotBlank:
L'élément annoté ne doit pas être nul et doit contenir au moins un caractère non blanc. Accepte CharSequence
@NonNull refer to LombokVoici les grands détails que vous pourriez aimer Cliquez ici
De quel package avez-vous
NotNull
?Importation du projet Lombok
Devrait provenir du package javax.validation, je suppose.
Ah ok je vois, ça aurait du sens. Donc, si je veux utiliser les deux, je devrais utiliser le nom complet du package pour un?