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。那是行不通的。如果您在字段上放置约束,则访问用于获取要验证的属性(使用反射)。如果将它放在方法/getter 方法上,则使用访问。因此,注释的位置很重要。正如您似乎已经发现将注释放在方法上工作。当然,这会导致注释的位置不一致。你可以:

  • 只需放置此单个约束的注释
  • 完全切换到方法注释
  • 每次地址类型更改时更新布尔值(并摆脱 isAddressReferenceType 方法)
  • 创建用于验证 addressReference 的自定义约束

只是一些想法。这完全取决于您的用例和个人喜好。

于 2013-04-24T16:29:53.560 回答