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
cool, ich habe das Projekt bereits abgeschlossen, aber thx für den Hinweis. – Juri