2009-04-25 9 views
0

これを正しく説明できることを願っています。私はSpringを使ってLiferay用のポートレットを開発しています。それはピンボードシステムです。だから私は特定のピンボードエントリの詳細を示すビュー(Jsp)を持っています。さらに、ユーザが現在見ているピンボードエントリに新しいコメントを追加するためのAddCommentControllerに行くリンクがあります。 AddCommentControllerは、SpringのSimpleFormControllerを拡張し、また、それに接続されているバリデータを持っていますValidatorを使って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"); 
    } 

} 

今、ユーザーは自分のコメントを入力することができますビューは、2つを持っていますボタンを押して、保存してキャンセルします。ここには2つのジェネレータが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を参照)、S。T. ActionResponseに渡しますピンボード・エントリの詳細ビューでは、エントリを再度ロードして表示することができます。

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」パラメータが緩和され、PortletRequestまたはレスポンスがないため、CommentValidatorでそのパラメータを読み取ってレスポンスに再度渡す方法はありません。

今のところ私はセッションにIDを格納し、そこから取得することでこの問題を解決しました。しかし、あなたの中にはセッションを使わなくても別の解決策があるのか​​どうか尋ねたいと思っていました。私は確信している。再び呼び出されるshowForm(..)検証エラーで

おかげで、
樹里

答えて

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

。あなたはこの方法を上書きし、好きなようにRequestResponseを操作することができます。

4

さらに簡単な解決策は、renderParametersプロパティを設定することです。 renderParametersプロパティは、SimpleFormControllerが常に転送するパラメータ名の配列です。たとえば:

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

は、これは「pinboardEntryId」パラメータが任意のコードを追加せずに毎回渡されるようになります。

+0

私はすでにプロジェクトを終了しましたが、ヒントのためにthxです。 – Juri

関連する問題