web-dev-qa-db-ja.com

@Validを使用してSpringブートでリクエストの本文を検証できない

@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アノテーションの両方が機能していません。

解決策はありますか?

4
asp008

ここでいくつかのこと: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;
}
0
fiveelements