0

我希望我能正确解释这一点。我正在使用 Spring 为 Liferay 开发一个 portlet。这是一个插板系统。所以我有一个视图(Jsp),它显示了某个 pinboard 条目的详细信息,给定了它的 id。此外,还有一个指向 AddCommentController 的链接,用于向用户当前正在观看的 pinboard 条目添加新评论。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)并将其传递给 pinboard 条目详细视图中的 ActionResponse st,我可以再次加载条目并显示它。

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 存储在会话中并从那里检索它来解决这个问题。但是,我想问一下你们中的一些人是否有无需使用会话的替代解决方案。我很确定有一个。

谢谢,
朱里

4

3 回答 3

4

一个更简单的解决方案是设置 renderParameters 属性。renderParameters 属性是 SimpleFormController 将始终转发的参数名称数组。例如:

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

这将导致每次都传递“pinboardEntryId”参数而无需任何附加代码。

于 2009-10-13T13:32:08.470 回答
0

showForm(..)再次调用验证错误。您可以覆盖此方法并Request根据需要进行操作Response

于 2009-04-30T19:45:39.100 回答
0

我首先尝试了 Oliver Gierke 建议的 showForm(..) 方法(感谢您的反馈),但这并没有达到预期的效果。showForm(..) 想要返回一个我不想关心的新 ModelAndView,因为这应该由 onSubmitAction(...) 完成。

正确的方法是覆盖

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

在那里,所有需要的信息都可用。我现在可以使用 BindingException 检查是否存在验证错误errors.hasErrors()。如果是这种情况,我可以读取所需的参数并将它们转发到响应以将它们再次显示在表单上。否则我只是调用onSubmitAction(..),传递所需的参数,例如我在 processFormSubmission 中可用的请求、响应等。

于 2009-05-02T09:21:48.960 回答