Je veux valider mon corps de la demande avec l' @Valid
annotation, mais il ne fonctionne pas au printemps Boot
J'ai une classe de demande dans le fichier JAR que je ne peux pas modifier avec deux champs. Un champ est de type objet. Ma classe contrôleur accepte cet objet de classe en tant que corps de la demande. Quand je passe mon ci-dessous JSON au contrôleur, la validation ne fonctionne pas. Voici des exemples de code.
Demande de classe:
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 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);
}
L'appel des jeux de codes demande comme ci-dessous:
StudentSignUpRequest studentSignUpRequest = new StudentSignUpRequest();
//setter methods
Request payload = new Request();
payload.setData(studentSignUpRequest);
Ceci est la demande que je vous envoie:
Pour plus de 64 caractères pour prenom:
JSON Exemple:
{
"data": {
"firstName": "student111111111111111111111111111111111111111111111111111111111111",
"lastName": "somesurname",
"email": "[email protected]"
}
}
Où le prénom non inclus:
{
"data": {
"lastName": "somesurname",
"email": "[email protected]"
}
}
Ici , à la fois @Size
, ainsi que l' @NotNull
annotation ne fonctionne pas.
Toute solution?
La validation aurait travaillé si la Request
classe était comme;
public class Request {
@Valid
StudentSignUpRequest data;
// other stuff
}
Le fait que vous avez pas de type de classe pour le data
rend impossible pour la validation à appliquer sur elle, sans tenir compte du fait qu'il n'y a même pas une @Valid
annotation sur le terrain. L' @Valid
annotation est utilisée pour propager la cascade de validation.
Mais puisque vous ne pouvez pas modifier l' Request
objet, nous allons continuer avec une autre façon de validation de la poignée sans le faire manuellement.
Une autre façon est à la validation de déclenchement après que vous obtenez le StudentSignUpRequest
d' request
objet;
StudentSignUpRequest signUpRequest = request.getData(StudentSignUpRequest.class);
loginRegistrationService.signUpStudent(signUpRequest) // validation will trigger with this call
Ce que vous pouvez faire est la suivante;
@Service
@Validated
public class LoginRegistrationService {
public void signUpStudent(@Valid StudentSignUpRequest signUpRequest) {
// some logic
}
}
avec l' @Validated
annotation, vous activez la vérification de validation pour toutes les @Valid
args annotés dans les public
méthodes de cette classe.
Peut être utilisé avec la validation de niveau de procédé, ce qui indique qu'une classe spécifique est censé être validé au niveau du procédé (agissant comme un point d'action de l'intercepteur de validation correspondant)
Cela peut être coûteux puisque vous voudriez obtenir une violation de contrainte le plus rapidement possible sans faire des travaux coûteux pour une demande déjà condamné.