我从不使用自定义访问器,而是仅使用hibernate验证器使用字段默认值

时间:2013-04-23 15:31:45

标签: java spring spring-roo bean-validation hibernate-validator

我在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文件中的以下键无法解析:{{1} }

编辑1

Full bean:

AssertTrue.familyAdvertisementSearchCriteriaInfo.addressReferenceValid

验证发生在以下控制器中:

@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;
    }
}

1 个答案:

答案 0 :(得分:1)

我想我现在明白你要做什么了。您希望将约束放在字段上,但在验证期间,您希望调用/使用方法isAddressReferenceValid。那不行。如果在字段上放置约束,则使用访问权限来获取要验证的属性(使用反射)。如果将其放在方法/ getter方法上,则使用访问权限。所以他放置的注释很重要。您似乎已经发现将注释放在方法上可行。当然,这会导致注释的放置不一致。你可以:

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

只是一些想法。这一切都取决于您的使用案例和个人喜好。