2009-04-25 7 views
0

Ich hoffe, ich kann das richtig erklären. Ich entwickle ein Portlet für Liferay mit Spring. Es ist ein Pinboard-System. So habe ich eine Ansicht (Jsp), die das Detail eines bestimmten Pinboardeintrags zeigt, wenn man seine ID angibt. Außerdem gibt es einen Link, der zu einem AddCommentController führt, um einen neuen Kommentar zu dem Pinnwandeintrag hinzuzufügen, den der Benutzer gerade anschaut. Die AddCommentController erstreckt Spring SimpleFormController und hat auch einen Validator mit ihm verbunden:Anforderungsparameter auf Spring SimpleFormController mit 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> 

Der Validator ist wirklich einfach und sieht wie folgt aus:

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

} 

Nun ist die Ansicht, in der der Benutzer seinen Kommentar eingeben können zwei Schaltflächen, Speichern und Abbrechen. Hier sind die zwei Generatoren für die entsprechenden URLs.

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

Im onSubmitAction des AddCommentController las ich den Parameter aus (der erste actionURL siehe oben) und an dem ActionResponse S. T. passieren In der Detailansicht des Pinboard-Eintrags kann ich den Eintrag erneut laden und anzeigen.

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

Dies alles funktioniert gut, außer wenn ein Validierungsfehler auftritt. In diesem Fall verliere ich den Parameter "pinboardEntryId" aus der URL, und ich habe keine Möglichkeit, diesen Parameter im CommentValidator zu lesen, um ihn erneut an die Antwort zu übergeben, da ich keine PortletRequest oder Antwort habe.

Für jetzt habe ich dieses Problem gelöst, indem ich die ID in der Sitzung gespeichert habe und sie von dort abruft. Ich wollte jedoch fragen, ob einige von Ihnen eine alternative Lösung haben, ohne die Sitzung zu benutzen. Ich bin mir ziemlich sicher, dass es einen gibt.

Danke,
Juri

Antwort

0

Ich habe zuerst den von Oliver Gierke vorgeschlagenen ShowForm (..) -Ansatz ausprobiert (danke für das Feedback), aber das hat nicht wie erwartet funktioniert. Die showForm (..) möchte eine neue ModelAndView zurückgeben, die ich nicht interessieren möchte, da dies von der onSubmitAction (...) erledigt werden sollte.

Der richtige Ansatz ist es, die

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

Dort alle benötigten Informationen zur Verfügung außer Kraft zu setzen. Ich kann jetzt die BindingException überprüfen, ob Validierungsfehler aufgetreten sind, indem errors.hasErrors() verwendet wird. Wenn das der Fall ist, kann ich die benötigten Parameter lesen und sie an die Antwort weiterleiten, um sie wieder auf dem Formular zu haben. Ansonsten rufe ich einfach die onSubmitAction(..) an und übergebe die benötigten Parameter wie die Anfrage, die Antwort usw., die ich in der processFormSubmission zur Verfügung habe.

0

Auf Validierungsfehler showForm(..) wieder aufgerufen wird. Sie können diese Methode überschreiben und Request und Response beliebig manipulieren.

4

Eine noch einfachere Lösung ist das Festlegen der RenderParameters -Eigenschaft. Die renderParameters-Eigenschaft ist ein Array von Parameternamen, die SimpleFormController immer weiterleitet. Beispiel:

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

Dadurch wird der Parameter 'pinboardEntryId' jedes Mal ohne zusätzlichen Code übergeben.

+0

cool, ich habe das Projekt bereits abgeschlossen, aber thx für den Hinweis. – Juri