我在 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/