Надеюсь, я смогу это объяснить правильно. Я разрабатываю портлет для 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
классный, я уже закончил проект, но thx для подсказки. – Juri