代码之家  ›  专栏  ›  技术社区  ›  Juri

使用验证器在Spring SimpleFormController上保存请求参数

  •  0
  • Juri  · 技术社区  · 17 年前

    <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);
          ...
       }
       ...
    }
    

    现在,我通过将id存储在会话上并从那里检索它来解决这个问题。然而,我想问一下,你们中的一些人是否有一个不必使用会话的替代解决方案。我很确定有一个。


    尤里

    3 回复  |  直到 17 年前
        1
  •  4
  •   Ed K    16 年前

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

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

    这将导致每次都传递“pinboardEntryId”参数,而不需要任何额外的代码。

        2
  •  0
  •   Oliver Drotbohm    17 年前

    关于验证错误 showForm(..) 再次被召唤。您可以覆盖此方法并进行操作 Request Response 如你所愿。

        3
  •  0
  •   Juri    17 年前

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

    正确的做法是推翻

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

    errors.hasErrors() 如果是这样的话,我可以读取所需的参数并将其转发给响应,以便再次将其显示在表单上。否则,我只是打电话给 onSubmitAction(..)