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