Spring портлет mvc Валидация завершается неудачно при отправке отредактированной формы - PullRequest
2 голосов
/ 26 мая 2011

У меня есть форма с несколькими проверками. Во время отправки новой формы, если проверка не пройдена, я вижу эти сообщения об ошибках. но во время редактирования формы, когда я намеренно меняю поле на пустое и отправляю форму, сообщения об ошибках не отображаются на странице Jsp, но я могу получить количество ошибок в контроллере как 1.

<portlet:actionURL var="actionUrl">
    <portlet:param name="action" value="editCommunity"/>
    <portlet:param name="communityID" value="${community.id}"/>
</portlet:actionURL>

<liferay-ui:tabs names="Details" />

<form:form commandName="community" method="post" action="${actionUrl}">
    <form:hidden path="id"/>

    <div><form:errors cssClass="portlet-msg-error" path="*"/></div>

    <table class="manager-detail">
        <tr>
            <th class="portlet-form-field-label">
                <label for="community_label_name"><spring:message code="community.label.name"/></label>         
                <span class="manager-field-required">*</span>
            </th>
            <td><form:input id="community_label_name" cssClass="portlet-form-input-field" path="name" size="30" maxlength="80" /></td>
        </tr>

Мой метод редактирования контроллера .....

визуализация формы редактирования

@RequestMapping(params = "action=editCommunity")
public String showEditCommunityForm(final RenderRequest request,
        @RequestParam(value="communityID") Long id, final Model model)
        throws CommunityNotFoundException {
    final ThemeDisplay themeDisplay = (ThemeDisplay) request
            .getAttribute(WebKeys.THEME_DISPLAY);

    model.addAttribute("community", communityService.getCommunity(id));


    return "communityEdit";
}

отредактированная форма отправлена ​​

@RequestMapping(params = "action=editCommunity")
public void submitEditCommunityForm(final ActionRequest request,
        final ActionResponse response,
        @ModelAttribute("community") Community community,
        BindingResult result, Model model) throws SystemException, PortalException {

    communityValidator.validate(community, result);
    if (result.hasErrors()) {
        System.out.println("validation errors size..."+result.getErrorCount());
        //model.addAttribute("community", community);
        response.setRenderParameter("action", "editCommunity");
        response.setRenderParameter("communityID", String.valueOf(community
                .getId()));

    }

}

Это не полный код, а блок

Я пробовал пару вещей, как, изменение метода http с поста на POST, но ничего не работает. Проверка корректно работает при создании формы, но не при редактировании.

Я что-то упустил? пожалуйста, дайте мне предложения.

Приветствие Вамши

Ответы [ 2 ]

6 голосов
/ 01 июля 2011

Сохранение сообщений об ошибках валидации может быть настоящей болью! Я много чего перепробовал - от настройки поведения перенаправления контейнера портлета до использования jsr303 вместо весенней проверки.

Единственное решение, которое у меня постоянно было, и успешная реализация действительно ужасна:

  • Выполните проверку в методе действия.
  • Если обнаружены ошибки, сохраните объект BindingResult / Errors с «вашим собственным ключом» в модели Spring и прервите обработку действия.
  • Вы перенаправлены на метод рендеринга
  • Там вы берете объект Errors и кладете его обратно в ключ, где его ожидает «Spring validation».

В коде это выглядит примерно так:

@ActionMapping
public void invite(@ModelAttribute MyFormBean myFormBean,
                   BindingResult result, Model model) {
    // validate indata
    myValidator.validate(myFormBean, result);

    // Workaround to preserve Spring validation errors
    if (result.hasErrors()) {
        model.addAttribute("errors", result);
        return;
    }
    ...
}

@RequestMapping
public String showForm(@ModelAttribute("myFormBean") MyFormBean myFormBean, 
                       Model model) {
    ...

    // Workaround to get the errors form-validation from actionrequest
    Errors errors = (Errors) model.asMap().get("errors");
    if (errors != null) {
       model.addAttribute(
          "org.springframework.validation.BindingResult.myFormBean", errors);
    }

    return "myForm";
 }

Информация, хранящаяся в модели в разделе "org.springframework.validation.BindingResult. *", Автоматически удаляется между обработкой действия и обработкой рендеринга, а при явном сохранении ее в "ошибках" информация будет доступна представлению .

Это уродливое решение, вы должны знать больше, чем вы хотите о том, как на самом деле работает реализация, оно противоречит интуитивному принципу, и если его неправильно прокомментировать, этот код может быть легко удален кем-то, кто не знаком с проблемой, но это не много кода, и это работает.

2 голосов
/ 30 августа 2012

Вы можете опустить @ModelAttribute на этапе рендеринга и извлечь его из модели:

@ActionMapping
public void invite(@ModelAttribute MyFormBean myFormBean,
                   BindingResult result, Model model) {
    // validate indata
    myValidator.validate(myFormBean, result);

    ...
}

@RequestMapping
public String showForm(Model model) {

    MyFormBean myFormBean = (MyFormBean)model.asMap().get("myFormBean");
    ...

    return "myForm";
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...