web-dev-qa-db-fra.com

Impossible de valider le corps de la demande dans Spring Boot avec @Valid

Je souhaite valider mon corps de demande avec @Valid annotation, mais cela ne fonctionne pas dans Spring Boot

J'ai une classe Request dans le fichier JAR que je ne peux pas modifier avec deux champs. Un champ est de type Objet. Ma classe de contrôleur accepte cet objet de classe comme corps de demande. Lorsque je passe mon JSON ci-dessous au contrôleur, la validation ne fonctionne pas. Voici des exemples de code.

Classe de demande:

public class Request {

    Object data;
    Map<String, Object> meta;

    public <T> T getData() throws ClassCastException {
        return (T) this.data;
    }
}

Une autre classe:

public class StudentSignUpRequest {

     @NotNull(message = "First Name should not be empty")
     @Size(max = 64, message = "FirstName should not exceed 64 characters")
     private String firstName;

     @NotNull(message = "Last Name should not be empty")
     @Size(max = 64, message = "LastName should not exceed 64 characters")
     private String lastName;

     @NotNull(message = "Email cannot be empty")
     @Size(max = 50, message = "Email cannot exceed 50 characters")
     @Pattern(regexp = EMAIL_REGEX_PATTERN, message = "Email should contain a valid email address.")
     private String email;

     // other fields
}

Classe de contrôleur:

@PostMapping(value = Constants.STUDENT_SIGN_UP)
public Response signUpStudent(@Valid @RequestBody Request request, HttpServletRequest servletRequest) {

    // retrieving the actual resource from request payload
    StudentSignUpRequest signUpRequest = request.getData(StudentSignUpRequest.class);
    // call service to sign-up student
    return loginRegistrationService.signUpStudent(signUpRequest);
}

La demande de jeux de codes d'appel comme ci-dessous:

StudentSignUpRequest studentSignUpRequest = new StudentSignUpRequest();
//setter methods

Request payload = new Request();
payload.setData(studentSignUpRequest);

Voici la demande que j'envoie:

Pour plus de 64 caractères pour firstName:

Exemple JSON:

{
    "data": {
        "firstName": "student111111111111111111111111111111111111111111111111111111111111",
        "lastName": "somesurname",
        "email": "[email protected]"
    }
}

Lorsque le prénom n'est pas inclus:

{
    "data": {
        "lastName": "somesurname",
        "email": "[email protected]"
    }
}

Ici les deux @Size aussi bien que @NotNull l'annotation ne fonctionne pas.

Toute solution?

4
asp008

Deux choses ici: Le type Object pour data dans la classe Request empêche le validateur de savoir qu'il est de type StudentSignUpRequest. Modifiez donc le type de données.

public class Request {
    StudentSignUpRequest data;
    Map<String, Object> meta;
}

Deuxièmement, bien que vous ayez ajouté @Valid dans la méthode du contrôleur, afin de valider les champs dans StudentSignUpRequest, vous devez également ajouter @Valid ici. Désormais, les données seront validées si elles sont transmises dans la demande d'API. En cas d'absence, la validation n'aura pas lieu. Si vous souhaitez que les données soient obligatoirement transmises, ajoutez également @NotNull.

public class Request {

    @Valid
    @NotNull
    StudentSignUpRequest data;
    Map<String, Object> meta;
}
0
fiveelements