0

javabean 内に次のコードがあります。

@AssertTrue
private boolean addressReferenceValid;

public boolean isAddressReferenceValid() {
    if (addressType.equals(AddressType.ON_THE_FLY_ADDRESS) && StringUtils.isEmpty(addressReference)) {
        return false;
    }
    return true;
}

私が抱えている問題は、isAddressReferenceValidアクセサーが使用されておらず、 addressReferenceValidのデフォルト値のみが使用されているように見えることです(つまりfalse)。

Spring Roo がその変数に対して独自のアクセサーを生成していないことを再確認しました。

誰でも助けてもらえますか?

PS @AssertTrue アノテーションをメソッドに直接配置することはできません。ValidationMessages.propertiesファイル内の次のキーが解決されないためです。AssertTrue.familyAdvertisementSearchCriteriaInfo.addressReferenceValid

編集1

フルビーン:

@RooEquals
@RooJavaBean
public class FamilyAdvertisementSearchCriteriaInfo {

    @Valid
    private FamilyAdvertisementSearchCriteria searchCriteria;

    private Address currentAddress;

    private String addressReference;

    @NotNull
    private AddressType addressType;

    @AssertTrue(groups=Default.class)
    private boolean addressReferenceValid;

    public boolean isAddressReferenceValid() {
        if (addressType.equals(AddressType.ON_THE_FLY_ADDRESS) && StringUtils.isEmpty(addressReference)) {
            return false;
        }
        return true;
    }
}

検証は次のコントローラーで行われます。

@RequestMapping(value = "/familyAdvertisementSearch", method = RequestMethod.POST, produces = "text/html")
public String familyAdvertisementSearchResults(@ModelAttribute @Validated(Default.class) FamilyAdvertisementSearchCriteriaInfo familyAdvertisementSearchCriteriaInfo, BindingResult bindingResult, Model model) {
        if(bindingResult.hasErrors()){
            populateModel(model);
            familyAdvertisementSearchCriteriaInfo.setCurrentAddress(memberService.retrieveCurrentMemberAddress());
            return "search/familyAdvertisementSearchForm";
        }
...
4

1 に答える 1

1

あなたが何をしようとしているのか、今なら理解できると思います。フィールドに制約を設定したいのですが、検証中にメソッド isAddressReferenceValid が呼び出される/使用されることが予想されます。それはうまくいきません。フィールド アクセスに制約を設定すると、検証するプロパティを取得するために使用されます (リフレクションを使用)。メソッド/ゲッター メソッドに配置すると、アクセスが使用されます。したがって、注釈の配置は重要です。メソッドにアノテーションを配置することは既に発見されているようです。もちろん、これは注釈の一貫性のない配置につながります。あなたは出来る:

  • この単一の制約の注釈を配置するだけです
  • メソッドアノテーションに完全に切り替える
  • アドレスの種類が変わるたびにブール値を更新します (そして isAddressReferenceType メソッドを取り除きます)
  • addressReference を検証するためのカスタム制約を作成します

ほんのいくつかのアイデア。それはすべて、ユースケースと個人的な好みによって異なります。

于 2013-04-24T16:29:53.560 に答える