2013-04-23 34 views
0

我有一个JavaBean中下面的代码:我的自定义访问是从未使用过,只有场默认值由Hibernate验证,而不是

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

任何人都可以请帮忙吗?

附:我不能直接把@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"; 
     } 
... 
+0

你如何验证bean?你想要在哪一层应用中进行验证?什么触发验证?或者你是否直接使用Bean Validation API进行验证?是否有其他约束你的bean正在验证?也许你可以发布完整的bean? – Hardy 2013-04-24 12:03:46

+0

哈代!我已根据要求编辑了我的帖子。是的,还有其他一些限制,如上所示。请让我知道,如果你需要进一步的信息... – balteo 2013-04-24 15:51:12

回答

1

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

  • 只要将注释此单约束
  • 开关方法的注释完全
  • 每个地址类型的变化(和摆脱isAddressReferenceType方法)时
  • 更新布尔创建用于验证地址的自定义约束参考

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

+0

顺便说一句,我不明白你对消息插值问题的评论。 – Hardy 2013-04-24 16:35:06

+0

'只需在该单个约束的方法上放置注释'似乎可以正常工作。就消息插值问题而言,我只注意到只使用没有字段的方法,并没有工作。至于反射被使用,我没有意识到这一点......无论如何非常感谢。 – balteo 2013-04-24 17:20:21

相关问题