2010-09-03 138 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)