2009-04-25 98 views
0

我希望我能够正确解释这一点。我正在使用Spring开发Liferay的portlet。这是一个插件系统。所以我有一个视图(Jsp),它显示了某个特定插件条目的详细信息,并给出了其ID。此外,还有一个链接指向AddCommentController,用于向用户当前正在观看的插件条目添加新评论。该AddCommentController扩展Spring的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> 

在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

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

正确的做法是重写

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

在那里,所有需要的信息是可用的。我现在可以通过使用errors.hasErrors()来检查BindingException是否存在验证错误。如果是这样的话,我可以阅读所需的参数,并将它们转发给响应,让它们再次放在窗体上。否则,我只需调用onSubmitAction(..),传递所需的参数,如请求,响应等等,这些参数在processFormSubmission中可用。

0

在验证错误showForm(..)被再次调用。您可以覆盖此方法,并根据需要操作RequestResponse

4

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

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

这将导致'pinboardEntryId'参数在每次没有任何附加代码的情况下传递。

+0

很酷,我已经完成了项目,但thx的提示。 – Juri 2009-10-14 11:52:26