4
votes

L'annotation @NotNull ne fonctionne pas dans l'application Spring Boot. Pourquoi?

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.


4 commentaires

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.


3 Réponses :


2
votes

Avez-vous la bonne importation?
J'utilise import javax.validation.constraints.NotNull;


0 commentaires

4
votes

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 "";
    }
}


0 commentaires

4
votes

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


0 commentaires