3

春の REST アプリがあり、@Valid アノテーションを使用して、単純な @NotNull チェックで検証できる Bean フィールドを装飾したいと考えています。

public ResponseEntity<ExtAuthInquiryResponse> performExtAuthInq(@Valid @RequestBody ExtAuthInquiryRequest extAuthInquiryRequest)

このような

 @NotBlank(message = "requestUniqueId cannot be blank..")
private String requestUniqueId;

それに加えて、より複雑な検証を行うために @initBinder を使用したい (1 つのフィールドの値に基づいて 2 番目のフィールドが必須であるなど)

 @InitBinder("extAuthInquiryRequest")
protected void initExtAuthInqRequestBinder(WebDataBinder binder) {
    binder.setValidator(extAuthInqValidator);
}

バリデーターの実装は次のとおりです (条件付き検証の場合のみ)

@Override
public void validate(Object target, Errors e) {

    ExtAuthInquiryRequest p = (ExtAuthInquiryRequest) target;
    // Dont want to do this check here. Can be simply done in the bean using @NotNull checks
    ValidationUtils.rejectIfEmpty(e, "requestUniqueId", "requestUniqueId is empty");


    // this is a good candidate to be validated here
    if(StringUtils.isNotBlank(p.getPersonInfo().getContactInfo().getPhoneNumber().getPhoneType())){
        if(StringUtils.isBlank(p.getPersonInfo().getContactInfo().getPhoneNumber().getPhoneNumber())){
            e.rejectValue("personInfo.contactInfo.phoneNumber.phoneNumber", "phoneNumber is mandatory when phoneType is provided");
        }
    }
}

}

どちらか一方を使用する例をオンラインでたくさん見ました。両方のアプローチを一緒に試してみましたが、 @initBinder をセットアップすると、リクエスト オブジェクトの @valid アノテーションが受け入れられなくなります。

単純な @NotNull チェックのために、Spring Validator クラスにコードを書きたくないからです。両方の方法を一緒に行う方法はありますか。

4

1 に答える 1

0

簡単なフィールドレベルの検証のために JSR-303 に委譲するこのリンクのオンライン Spring Bean 検証を見つけました

魅力のように動作します..

于 2016-05-04T06:24:51.670 に答える