2010-09-03 3 views
2

У меня есть такой сценарий:Добавить Ошибка на Получ Spring аннотированный контроллер

  1. Я отобразить список активов для пользователей.
  2. Пользователь выбирает актив, а затем нажимает на добавочный элемент
  3. По моей просьбе, во время операции GET. Я использую класс службы, чтобы проверить, действительно ли этот актив все еще существует в БД
  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 нужно связать кучу ошибок с некоторыми объектами на модели, поэтому теги, такие как <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) 
Смежные вопросы