2013-04-23 30 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

相關問題