Question

J'espère que je serai en mesure d'expliquer cela correctement. Je développe un portlet pour Liferay en utilisant Spring. Il est un système de pinboard. J'ai donc une vue (Jsp) qui montre le détail d'une certaine entrée pinboard, compte tenu de son id. En outre, il y a un lien qui va à un AddCommentController pour ajouter un nouveau commentaire à l'entrée pinboard l'utilisateur est en train de regarder à. Le AddCommentController étend SimpleFormController de printemps et a également un validateur attaché à lui:

<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>

Le validateur est très simple et se présente comme suit:

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

}

Maintenant la vue dans laquelle l'utilisateur peut entrer son commentaire a deux boutons, Enregistrer et annuler. Voici les deux générateurs pour les urls selon.

<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>

Dans le onSubmitAction du AddCommentController je lis le paramètre (voir le 1er actionURL ci-dessus) et le transmettre à la ActionResponse S.T. dans la vue détaillée de l'entrée pinboard je peux à nouveau charger l'entrée et l'afficher.

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

Tout cela fonctionne très bien, sauf en cas d'erreur de validation se produit. Dans ce cas, je lâche le paramètre « pinboardEntryId » de l'URL, et je ne dispose d'aucun moyen de lire ce paramètre dans le CommentValidator pour le transmettre à nouveau la réponse que je n'ai pas PortletRequest ou réponse.

Pour l'instant je résolu ce problème en stockant l'identifiant de la session et en récupérant à partir de là. Je voulais demander si certains d'entre vous a une solution de rechange sans avoir à utiliser la session. Je suis tout à fait sûr qu'il y en a un.

Merci,
Juri

Était-ce utile?

La solution 3

J'ai d'abord essayé le ShowForm (..) approche suggérée par Oliver Gierke (merci pour les commentaires), mais cela n'a pas fonctionné comme prévu. Le ShowForm (..) veut retourner une nouvelle ModelAndView que je ne veux pas se soucier puisque cela doit être fait par le onSubmitAction (...).

La bonne approche consiste à remplacer le

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

, toutes les informations nécessaires sont disponibles. Je peux vérifier maintenant BindingException s'il y a eu des erreurs de validation à l'aide errors.hasErrors(). Si tel est le cas, je peux lire les paramètres nécessaires et les transmettre à la réponse de les avoir sur le formulaire. Sinon, je viens d'appeler le onSubmitAction(..), en passant les paramètres nécessaires tels que la demande, etc .. Reponse que j'ai disponible dans le processFormSubmission.

Autres conseils

Une solution encore plus facile est de définir la propriété renderParameters. La propriété renderParameters est un tableau de noms de paramètres qui SimpleFormController sera toujours en avant. Par exemple:

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

Cela entraînera le paramètre « pinboardEntryId » à passer chaque fois sans code supplémentaire.

En cas d'erreur de validation showForm(..) est appelée à nouveau. Vous pouvez remplacer cette méthode et de manipuler Request et Response que vous le souhaitez.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top