2010-09-03 37 views
2

對我有這樣的場景:添加錯誤GET方法春季註解控制器

  1. 我顯示資產的用戶列表。
  2. 用戶選擇一項資產,然後單擊添加項目
  3. 在我的請求映射中,在GET操作期間。我使用服務類來檢查此資產是否確實存在於DB中
  4. 如果不是,則應通過消息通知用戶。我用的形式:錯誤標籤

我的問題是,當我在方法簽名中添加了錯誤的對象,我得到這個錯誤:

Errors/BindingResult argument declared without preceding model attribute

代碼:

@RequestMapping(value = "/addItemsToAsset.htm", method = RequestMethod.GET) 
    public String setupForm(@RequestParam("assetID") Long assetID, 
      Errors error, ModelMap model) { 
     AssetItemVo voAsset = null; 

     if (assetID != null && assetID != 0) { 
      //Get data for asset from DB using assetID 
      List<AssetDraftTempVo> lstDraft = service.getAssetDraftByLngID(assetID); 

      if (lstDraft.size() == 0) { 
       voAsset = new AssetItemVo(); 
       // I wanted to add validation here. If no data for asset id is found, I would like to add an error to the error object 
       error.reject("123","Unable to find info for the asset in the database."); 
      } else { 
       AssetDraftTempVo voDraft = lstDraft.get(0); 
       voAsset = new AssetItemVo(); 
       voAsset.setStrPlant(voDraft.getStrPlant()); 
       . 
       . /*other DTO property here*/ 
       . 
      } 
     } 
     model.put("assetItemDetail", voAsset); 
     return "additemstoasset"; 
    } 

我的目標在顯示錶單的過程中,我想立即填充錯誤對象(如果有錯誤)

這是我的表單,爲了清晰起見。

<form:form modelAttribute="assetItemDetail" method="post"> 
    <div id="error_paragraph"> 
     <form:errors path="*" cssClass="errors" /> 
    </div> 
</form:form> 

爲了讓過去的錯誤,我手動更改方法簽名,並添加模型屬性,但它仍然無法填充表單:錯誤標籤

@RequestMapping(value = "/addItemsToAsset.htm", method = RequestMethod.GET) 
public String setupForm(@RequestParam("assetID") Long assetID, 
     @ModelAttribute("assetItemDetail") AssetItemVo voAssetData, Errors error, 
     ModelMap model) 

回答

3

如果你想要一個BindingResult與不存在的方法簽名的模型屬性相關聯,你可以做手工:

BindingResult result = new Errors(); 
... 
model.put(BindingResult.MODEL_KEY_PREFIX + "assetItemDetail", result); 
model.put("assetItemDetail", voAsset); 
2

Spring MVC的需要一堆錯誤關聯在模型上有一些對象,因此根據path屬性,標籤(如<form:errors path="..." />)將對應於模型對象。在這種情況下,它通過在控制器方法中的ModelMap參數後面直接查找Errors參數來實現。

嘗試交換錯誤和模型方法參數,看看它是否清除「聲明沒有先前模型屬性的錯誤/ BindingResult參數」錯誤。

更改此:

public String setupForm(@RequestParam("assetID") Long assetID, 
     @ModelAttribute("assetItemDetail") AssetItemVo voAssetData, Errors error, 
     ModelMap model) 

這樣:

public String setupForm(@RequestParam("assetID") Long assetID, 
     @ModelAttribute("assetItemDetail") AssetItemVo voAssetData, ModelMap model, 
     Errors error)