@Validで春のブートにリクエストボディを検証することができません

asp008:

私は私のリクエストボディを検証する@Valid注釈が、それは春ブーツで働いていません

私は二つのフィールドを変更することはできませんJARファイル内の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注釈が動作していません。

任意のソリューション?

buræquete:

場合は検証が働いてきたでしょうRequestクラスはのようでした。

public class Request {

    @Valid
    StudentSignUpRequest data;

    // other stuff
}

あなたは何のためのクラス型がないという事実data、それは不可能検証がさえ存在しないという事実を無視し、それに適用されるようになり@Valid、フィールド上の注釈を。@Valid注釈は、検証カスケードを伝播するために使用されます。

あなたが変更することはできませんので、しかし、Requestオブジェクトを、のは、それを手動で行うことなく検証を処理する別の方法を続けてみましょう。


あなたが取得した後、もう一つの方法は、トリガーの検証にあるStudentSignUpRequestからrequestオブジェクト。

StudentSignUpRequest signUpRequest = request.getData(StudentSignUpRequest.class);
loginRegistrationService.signUpStudent(signUpRequest) // validation will trigger with this call

次のように何ができることです。

@Service
@Validated
public class LoginRegistrationService {

    public void signUpStudent(@Valid StudentSignUpRequest signUpRequest) {
        // some logic
    }
}

@Validated注釈、あなたはすべてのための検証チェック有効になります@Validで、注釈付き引数publicそのクラス内のメソッドを。

特定のクラスは、メソッドレベルで検証されることになっていることを示す、方法のレベルの検証で使用することができる(対応する検証インターセプター用のポイントカットとして作用します)

あなたはすでに運命の要求に対して任意の高価な仕事をしてなくて、できるだけ早くすべての制約違反を取得したいと思いますので、これはコストがかかります。

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=229780&siteId=1