Сохранение параметров запроса в Spring SimpleFormController с помощью Validator - PullRequest
0 голосов
/ 25 апреля 2009

Я надеюсь, что смогу объяснить это правильно. Я разрабатываю портлет для Liferay с помощью Spring. Это система с доской для записей. Так что у меня есть представление (Jsp), которое показывает детали определенной записи в буфер обмена, учитывая его идентификатор. Кроме того, есть ссылка, которая идет на AddCommentController для добавления нового комментария к записи в доске, на которой в данный момент просматривает пользователь. AddCommentController расширяет SimpleFormController в Spring и имеет также прикрепленный к нему валидатор:

<bean id="addCommentController" class="com.lifepin.controllers.AddCommentController" parent="lifePinControllerTemplate">
    <property name="formView" value="addComment" />
    <property name="successView" value="viewEntryDetail" />
    <property name="validator" ref="commentValidator"/>
</bean>

Валидатор действительно прост и выглядит следующим образом:

public class CommentValidator implements Validator {

    public boolean supports(Class clazz) {
        return clazz.equals(Comment.class);
    }

    public void validate(Object obj, Errors validationError) {
        ValidationUtils.rejectIfEmptyOrWhitespace(validationError, "content", "err.content.empty", "This value is required");
    }

}

Теперь представление, где пользователь может ввести свой комментарий, имеет две кнопки: Сохранить и отменить. Вот два генератора для соответствующих URL.

<portlet:actionURL var="actionUrl">
    <portlet:param name="action" value="addComment"/>
    <portlet:param name="pinboardEntryId" value="${param.pinboardEntryId}"/>
</portlet:actionURL>

<portlet:renderURL var="cancelUrl">
    <portlet:param name="action" value="viewPinboardEntry"/>
    <portlet:param name="pinboardEntryId" value="${param.pinboardEntryId}"/>
</portlet:renderURL>

В onSubmitAction AddCommentController я считываю параметр (см. 1-й actionURL выше) и передаю его в ActionResponse s.t. в подробном представлении записи в буфер обмена я могу снова загрузить запись и отобразить ее.

public class AddCommentController extends SimpleFormController{
   ...
   @Override
   protected void onSubmitAction(ActionRequest request, ActionResponse response, Object command, BindException bindException)
            throws Exception {

      long pinboardEntryId = PortletRequestUtils.getLongParameter(request, ParameterNameConstants.PINBOARDENTRY_ID, -1);
      ...
   }
   ...
}

Это все работает нормально, кроме случаев, когда возникает ошибка проверки. В этом случае я теряю параметр «pinboardEntryId» из URL, и у меня нет никакого способа прочитать этот параметр в CommentValidator, чтобы снова передать его в ответ, поскольку у меня нет PortletRequest или ответа.

Пока я решил эту проблему, сохранив идентификатор сеанса и получив его оттуда. Однако я хотел спросить, есть ли у кого-то из вас альтернативное решение без использования сеанса. Я совершенно уверен, что есть один.

Спасибо,
Juri

Ответы [ 3 ]

4 голосов
/ 13 октября 2009

Еще более простым решением является установка свойства renderParameters. Свойство renderParameters - это массив имен параметров, которые SimpleFormController всегда будет пересылать. Например:

    <bean id="addCommentController" class="...">
         ....
         <property name="renderParameters">
           <list>
             <value>pinboardEntryId</value>
           </list>
         </property>
    </bean>

Это приведет к тому, что параметр 'pinboardEntryId' будет передаваться каждый раз без дополнительного кода.

0 голосов
/ 02 мая 2009

Сначала я попробовал подход showForm (..), предложенный Оливером Гирке (спасибо за отзывы), но он не сработал, как ожидалось. ShowForm (..) хочет вернуть новый ModelAndView, который мне не нужен, так как это должно быть сделано onSubmitAction (...).

Правильный подход - переопределить

@Override
protected void processFormSubmission(ActionRequest request, ActionResponse response, Object command, BindException errors){
  ...
}

Там вся необходимая информация доступна. Теперь я могу проверить исключение BindingException на наличие ошибок проверки с помощью errors.hasErrors(). Если это так, я могу прочитать необходимые параметры и переслать их в ответ, чтобы они снова были в форме. В противном случае я просто вызываю onSubmitAction(..), передавая необходимые параметры, такие как запрос, ответ и т. Д., Которые у меня есть в processFormSubmission.

0 голосов
/ 30 апреля 2009

При ошибках проверки showForm(..) вызывается снова. Вы можете переписать этот метод и манипулировать Request и Response, как хотите.

...