2009-04-25 7 views
0

J'espère que je serai en mesure de l'expliquer correctement. Je développe un portlet pour Liferay en utilisant Spring. C'est un système de tableau. J'ai donc une vue (Jsp) qui montre le détail d'une certaine entrée de tableau, étant donné son identifiant. En outre, il y a un lien qui va à un AddCommentController pour ajouter un nouveau commentaire à l'entrée de panneau que l'utilisateur surveille actuellement. Le AddCommentController étend SimpleFormController de printemps et a également un validateur qui s'y rattachent:Garder les paramètres de la requête sur Spring SimpleFormController avec Validator

<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, le point de vue où l'utilisateur peut entrer son commentaire a deux boutons, Enregistrer et annuler. Voici les deux générateurs pour les urls correspondantes.

<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 du tableau, 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 lorsqu'une erreur de validation se produit. Dans ce cas, je perds le paramètre "pinboardEntryId" de l'URL, et je n'ai aucun moyen de lire ce paramètre dans le CommentValidator pour le passer à la réponse à nouveau puisque je n'ai aucune réponse ou PortletRequest. Pour l'instant, j'ai résolu ce problème en stockant l'ID sur la session et en le récupérant à partir de là. Je voulais cependant demander si certains d'entre vous ont une solution alternative sans avoir à utiliser la session. Je suis sûr qu'il y en a un.

Merci,
Juri

Répondre

0

J'ai d'abord essayé l'approche showForm (..) suggérée par Oliver Gierke (merci pour les commentaires) mais cela n'a pas fonctionné comme prévu. Le showForm (..) veut retourner un nouveau ModelAndView dont je ne veux pas m'occuper puisque cela devrait être fait par l'onSubmitAction (...).

La bonne approche est de passer outre la

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

Là-bas, toutes les informations nécessaires sont disponibles. Je peux vérifier maintenant le BindingException s'il y a eu des erreurs de validation en utilisant errors.hasErrors(). Si c'est le cas, je peux lire les paramètres nécessaires et les transmettre à la réponse pour les avoir à nouveau sur le formulaire. Sinon, j'appelle simplement le onSubmitAction(..), en passant les paramètres nécessaires tels que la demande, la réponse etc. que j'ai dans le processFormSubmission.

0

sur les erreurs de validation showForm(..) est appelée à nouveau. Vous pouvez remplacer cette méthode et manipuler Request et Response comme vous le souhaitez.

4

Une solution encore plus simple consiste à définir la propriété renderParameters. La propriété renderParameters est un tableau de noms de paramètres que SimpleFormController transmettra toujours. Par exemple:

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

Ceci entraînera le passage du paramètre 'pinboardEntryId' à chaque fois sans aucun code supplémentaire.

+0

cool, j'ai déjà terminé le projet, mais merci pour l'indice. – Juri

Questions connexes