我希望我能够正确解释这一点。我正在使用Spring为Liferay开发一个portlet。这是一个插板系统。所以我有一个视图(Jsp),它显示了某个pinboard条目的细节,给出了它的id。此外,还有一个链接指向AddCommentController,用于向用户当前正在观看的插板条目添加新注释。 AddCommentController扩展了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");
}
}
现在用户可以输入评论的视图有两个按钮,保存并取消。以下是相关网址的两个生成器。
<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>
在AddCommentController的onSubmitAction中,我读出了参数(参见上面的第一个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);
...
}
...
}
这一切都正常,除非发生验证错误。在那种情况下,我从URL中删除了“pinboardEntryId”参数,我没有任何方法可以在CommentValidator中读取该参数,以便再次将其传递给响应,因为我没有任何PortletRequest或响应。
现在我通过在会话中存储id并从那里检索它来解决了这个问题。我想问一下,如果你们中的一些人有一个替代解决方案而不必使用会话。我很确定有一个。
谢谢,
树里
答案 0 :(得分:4)
更简单的解决方案是设置renderParameters属性。 renderParameters属性是SimpleFormController将始终转发的参数名称数组。例如:
<bean id="addCommentController" class="...">
....
<property name="renderParameters">
<list>
<value>pinboardEntryId</value>
</list>
</property>
</bean>
这将导致每次都传递'pinboardEntryId'参数而不需要任何其他代码。
答案 1 :(得分:0)
验证错误showForm(..)
再次被调用。您可以覆盖此方法并根据需要操作Request
和Response
。
答案 2 :(得分:0)
我首先尝试了Oliver Gierke建议的showForm(..)方法(感谢您的反馈)但是没有达到预期效果。 showForm(..)想要返回一个我不想关心的新ModelAndView,因为它应该由onSubmitAction(...)来完成。
正确的方法是覆盖
@Override
protected void processFormSubmission(ActionRequest request, ActionResponse response, Object command, BindException errors){
...
}
在那里,所有需要的信息都可用。我现在可以使用errors.hasErrors()
检查BindingException是否存在验证错误。如果是这种情况,我可以阅读所需的参数并将它们转发给响应,以便再次将它们放在表单上。否则,我只需调用onSubmitAction(..)
,传递所需的参数,例如我在processFormSubmission中可用的请求,响应等。