Добавить ошибку на GET METHOD Spring аннотированный контроллер - PullRequest
2 голосов
/ 03 сентября 2010

У меня есть такой сценарий:

  1. Я отображаю список активов для пользователей.
  2. Пользователь выбирает актив и затем нажимает добавить элемент
  3. По моему запросу, во время операции GET. Я использую класс обслуживания, чтобы проверить, действительно ли этот ресурс все еще существует в БД
  4. Если нет, пользователь должен быть уведомлен сообщением. Я использую форму: тег ошибки

Моя проблема, когда я добавляю объект ошибки в сигнатуру метода, я получаю эту ошибку:

Аргументы Errors / 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 ]

3 голосов
/ 03 сентября 2010

Если вы хотите связать BindingResult с атрибутом модели, которого нет в сигнатуре метода, вы можете сделать это вручную:

BindingResult result = new Errors();
...
model.put(BindingResult.MODEL_KEY_PREFIX + "assetItemDetail", result); 
model.put("assetItemDetail", voAsset); 
2 голосов
/ 03 сентября 2010

Spring MVC необходимо связать кучу ошибок с некоторыми объектами в модели, поэтому теги, такие как <form:errors path="..." />, будут соответствовать объектам модели в соответствии с атрибутом path.В этом случае это делается путем поиска аргумента Errors непосредственно после аргумента ModelMap в вашем методе контроллера.

Попробуйте поменять местами аргументы метода ошибки и модели и посмотреть, не очищает ли он «ошибкиАргумент / BindingResult объявлен без предшествующего атрибута модели "error.

Измените это:

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) 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...