Since my "validation" error is really an Exception that is thrown by a manager layer object and that is handled by the Struts Exception handler according to what is configured in struts-config.xml, I didn't have a place to invoke saveToken if one of these Exceptions was thrown, because my Action was not catching the Exception -- Struts' Exception handler was.
So I put in a try-catch block in my Action code around the invocations to the manager layer objects. If one of these "validation" Exceptions is thrown, I catch it and simply rethrow it -- but this gives me a place to insert a saveToken invocation before I rethrow the Exception. It's not ideal, but it's simple at least.
What I really would like is, to mimic what Action.saveToken does, within the execute method of an ExceptionHandler extension, whenever one of these types of Exceptions is handled. Then I don't have to catch and rethrow. Will this work? It might depend on what exactly Action.saveToken is doing (and how the token hidden parameter ends up being rendered in the form) I guess, since the invocation of saveToken would occur in a different chronological place (ExceptionHandler.execute) from where it occurs in my current solution (Action.execute).
Or is there a better idea still?
Thanks, Erik
Susan Bradeen wrote:
Erik Weber <[EMAIL PROTECTED]> wrote on 08/25/2004 09:03:18 AM:
I am using saveToken, isTokenValid, etc., to ensure that a registration/update form is not stale. I invoke this method from execute
in the setup Action, just before forwarding to the form page.
When the form is submitted, there are two levels of validation before the form data is processed.
First, input validation happens. I use ValidatorForm with the Validator plugin. If there is an input validation error, Struts forwards back to the input page, and the original synchronizer token is still in place as
a hidden variable in the form.
Second, if input validation succeeds, there is validation at the manager
layer. For example, a username might already be taken. If there is a manager validation error, Struts forwards back to the input page, but this time, the synchronizer token is not in place -- the hidden field in
the form is gone.
Erik, You are probably doing validation differently, but maybe this will spur some ideas. I called the validate from the 'save' Action, and passed the token with the request again after it failed validation:
if (!isCancelled(request)) {
// Validate form parameters ... ActionErrors validErrors = reqForm.validate(mapping, request);
if (validErrors != null && !validErrors.isEmpty()) {
saveErrors(request, validErrors);
saveToken(request);
return new ActionForward(mapping.getInput());
}// end validate
...}
HTH,
Susan Bradeen
The result of this is that if you request an add/edit form, fill it out,
submit it and cause a manager validation error, you cannot simply edit the offending field and resubmit the form -- you need a fresh form. This
is not the desired behavior, as this type of validation error should be treated the same as a form validation error, with regard to the synchronizer token.
I am using Struts declarative exception handling, which handles the forwarding.
How can I make sure the hidden field is rendered in the form after the second type of error occurs and Struts forwards back to the input screen? Why is it gone in the first place? I thought of RequestProcessor.processException, but couldn't see a way to invoke resetToken or saveToken. Should I do something with my form bean reset method?
Erik
--------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]
_____________________________________________________________________________
Scanned for SoftLanding Systems, Inc. by IBM Email Security Management Services powered by MessageLabs. _____________________________________________________________________________
--------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]
--------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]