@Valid
アノテーションを使用してリクエストの本文を検証したいのですが、Spring Bootで機能しません
JARファイル内に2つのフィールドで変更できないRequestクラスがあります。 1つのフィールドはObject型です。私のコントローラークラスは、このクラスオブジェクトをリクエスト本文として受け入れます。以下のJSONをコントローラーに渡すと、検証が機能しません。以下はコードサンプルです。
リクエストクラス:
public class Request {
Object data;
Map<String, Object> meta;
public <T> T getData() throws ClassCastException {
return (T) this.data;
}
}
別のクラス:
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
}
コントローラクラス:
@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);
}
呼び出しコードは次のようにリクエストを設定します:
StudentSignUpRequest studentSignUpRequest = new StudentSignUpRequest();
//setter methods
Request payload = new Request();
payload.setData(studentSignUpRequest);
これは私が送信しているリクエストです:
FirstNameが64文字を超える場合:
JSONの例:
{
"data": {
"firstName": "student111111111111111111111111111111111111111111111111111111111111",
"lastName": "somesurname",
"email": "[email protected]"
}
}
名が含まれていない場合:
{
"data": {
"lastName": "somesurname",
"email": "[email protected]"
}
}
ここでは、@Size
アノテーションと@NotNull
アノテーションの両方が機能していません。
解決策はありますか?
ここでいくつかのこと:Object
クラスのdata
のタイプRequest
は、バリデーターがタイプStudentSignUpRequest
であることを認識できなくなります。したがって、データ型を変更します。
public class Request {
StudentSignUpRequest data;
Map<String, Object> meta;
}
次に、コントローラメソッドに@Valid
を追加しましたが、StudentSignUpRequest
のフィールドを検証するには、ここにも@Validを追加する必要があります。 APIリクエストで渡された場合、データが検証されるようになりました。それがない場合、検証は行われません。データを強制的に渡す場合は、@ NotNullも追加します。
public class Request {
@Valid
@NotNull
StudentSignUpRequest data;
Map<String, Object> meta;
}