java - 我的自定义访问器从未使用过,只有字段默认值被 hibernate validator 使用

标签 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 没有为该变量生成自己的访问器。

有人可以帮忙吗?

P.S. 我无法将 @AssertTrue 注释直接放在方法上,因为这样 ValidationMessages.properties 文件中的以下键将无法解析:AssertTrue.familyAdvertisementSearchCriteriaInfo.addressReferenceValid

编辑 1:

全 bean :

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

验证发生在以下 Controller 中:

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

最佳答案

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

  • 只需为该单一约束添加注释即可
  • 完全切换到方法注释
  • 每次地址类型更改时更新 boolean 值(并摆脱 isAddressReferenceType 方法)
  • 创建自定义约束来验证 addressReference

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

关于java - 我的自定义访问器从未使用过,只有字段默认值被 hibernate validator 使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16173431/

相关文章:

Java Mapreduce 排序复合值

java - Spring框架中 `name`注解的 `RequestMapping`属性有哪些用例?

java - 重新启动 Roo 应用程序会刷新其对应的 MySQL 表

java - 带有 Tomcat DBCP 和多个数据源的 Spring JDBC

java - 编辑Java实体文件相当于在Spring Roo中生成then吗?

java - Spring Roo 的用户界面

java - Android SDK 安装失败。我该如何修复它?

Java套接字编程: How to send <STX>string-data<ETX> over TCP connection to the server?

java - 是什么让 rmi 服务器保持运行?

java - 与服务接口(interface)