2009-04-25 7 views
0

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

<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 я зачитала параметр (см первый 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

ответ

0

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

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

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

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

0

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

4

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

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

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

+0

классный, я уже закончил проект, но thx для подсказки. – Juri