Voici ma classe DTO.
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-validation</artifactId> </dependency>
Ici, j'essaie d'annoter le champ createdDate comme @NotNull mais cela ne fonctionne pas. Il permet dans le corps de la requête et après l'exécution du service dans postman de ne pas obtenir d'erreur.
J'ai essayé les options ci-dessous mais pas de chance.
1) J'ai essayé d'ajouter une dépendance maven.
public class AbstractDTO extends BaseDTO { private Integer createdBy; @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = DATE_FORMAT) @NotNull(message = "createdDate may not be null") private LocalDateTime createdDate; private Integer lastModifiedBy; @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = DATE_FORMAT) private LocalDateTime lastModifiedDate; private Boolean isActive; // getter & setters }
2) J'ai essayé d'annoter la classe DTO comme @Validated
3) J'ai essayé d'annoter le champ createdDate @Valid avec @NotNull mais toujours pas de chance.
Veuillez m'aider avec ce problème.
3 Réponses :
Avez-vous la bonne importation?
J'utilise import javax.validation.constraints.NotNull;
Votre DTO est correct.
À partir de l' exemple de saisie de formulaire de validation Spring Boot :
Utilisez l'annotation @Valid
.
Par exemple :
<bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter"> <property name="webBindingInitializer"> <bean class="org.springframework.web.bind.support.ConfigurableWebBindingInitializer"> <property name="validator" ref="validator" /> </bean> </property> </bean> <bean id="validator" class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean"> </bean>
Pourquoi utiliser l'annotation @Valid
? - Cela vous permet de valider l'ensemble des contraintes appliquées aux données membres d'une classe.
De plus, vous devez ajouter ceci ci-dessous dans l'applicationContext.xml (Source: ici ):
@Controller public class Controller { @PostMapping("/") public String checkPersonInfo(@Valid AbstractDTO abstractDTO, BindingResult bindingResult) { if (bindingResult.hasErrors()) { return "page"; } return ""; } }
Vous avez un point de terminaison avec un corps de requête comme;
@RestController public class TheController { @PostMapping(path = "/doSomething", consumes = "application/json", produces = "application/json") public void post(@Valid @RequestBody AbstractDTO request) { //code } }
Vous devez disposer de l'annotation @Valid
pour l'objet de requête. Seulement avec cela, vous auriez activé la validation pour AbstractDTO
pour le /doSomething
terminaison /doSomething
.
Vérifiez ici , pour plus de détails
Avez-vous essayé d'annoter la classe DTO comme @Validated dans la signature de la méthode du contrôleur? quelque chose comme
void foo(@Validated MyDTO dto)
@ArnaudDenoyelle Ce DTO a été utilisé à plusieurs endroits dans plus de 25 fichiers. Dois-je apporter des modifications à chaque fichier? N 'y a-t-il pas une autre solution?
Votre application a-t-elle démarreur - spring-boot-starter-web qui chargera Hibernate Validator dans la dépendance. Ce qui validera le bean. Veuillez suivre ce lien - stackoverflow.com/questions/48200444/...
Vérifiez ma réponse, cela devrait résoudre votre problème. Mais si
@NotNull
ne fonctionne pas pendant que@JsonPattern
fonctionne, cela peut être le cas avec le mauvais@NotNull
utilisé. Sinon, il semble que vous ayez oublié d'ajouter@Valid
sur votre méthode de contrôleur.