在GET METHOD上添加错误Spring注释控制器

时间:2010-09-03 02:53:49

标签: java spring spring-mvc annotations

我有这种情况:

  1. 我向用户显示资产列表。
  2. 用户选择资产,然后点击添加项
  3. 在我的请求图上,在GET操作期间。我使用服务类来检查这个资产是否确实存在于DB
  4. 如果没有,应通过消息通知用户。我使用表单:错误标记
  5. 我的问题是当我在方法签名中添加错误对象时,我收到了这个错误:

      

    在没有先前模型属性的情况下声明的错误/ BindingResult参数

    代码:

    @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) 
    

2 个答案:

答案 0 :(得分:3)

如果要将BindingResult与方法签名中不存在的模型属性相关联,可以手动执行:

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

答案 1 :(得分:2)

Spring MVC需要将一堆错误与模型上的某些对象相关联,因此<form:errors path="..." />等标记将根据path属性对应于模型对象。在这种情况下,它是通过在控制器方法中的Errors参数之后直接查找ModelMap参数来实现的。

尝试交换错误和模型方法参数,看看它是否清除了“没有先前模型属性声明的错误/ 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)