You are viewing a plain text version of this content. The canonical link for it is here.
Posted to user@struts.apache.org by Greg Lindholm <gr...@gmail.com> on 2009/11/02 20:10:57 UTC

Re: Preserving Messages and Garbage values Across a Redirect in Struts 2

Here is the link [1] for "Parameters in configuration results", and yes it
is suppose to be ${} not %{} (but I thought it had been changed to support
%{}, hard to keep straight.) so you want to use 3a not 3b.

You could show your getter, make sure it is public, returns a string and no
typos.
In the debugger you could break in prepare() make sure you are getting there
and also break in the getter to see if it is being called.

You need to go back to result type of chain and in the debugger trace
through and find where your recursion is coming from.



[1]
http://struts.apache.org/2.x/docs/parameters-in-configuration-results.html

On Mon, Nov 2, 2009 at 1:40 PM, Siddiq Syed <si...@yahoo.com> wrote:

>
> Hi Greg,
>
> Creating a variable in the action , seems not working.
>
> Here are the steps that i have done.
>
> step 1. Create a variable considTypeCode in the action , and so is getter
> ,setter.
> step 2. Create a prepare() method in the action, which sets the value of
> the
> considTypeCode to determine what will be the next page to display if
> validation fails.
>
>
> step 3.  a) specify ${} in struts.xml file as show below.
>
> <action name="saveInitConsiderationEval"
> class="com.activity.EvaluateCaseAction" method="saveInitConsiderationEval">
>                <interceptor-ref name="redirectInput"/>
>                <result name="success" type="redirect-action">
>                        determineCaseEvaluationType
>                </result>
>                 <result name="input" type="redirect-action">
>            determineCaseEvaluationTypeForInput
>        </result>
>        </action>
>           <action name="determineCaseEvaluationTypeForInput" >
>               <interceptor-ref name="redirectInput"/>
>           <result name="input" type="tiles">${considTypeCode}</result>
>        </action>
>
>          In this case it is throwing the below mention exception
>
>      javax.servlet.ServletException:
> org.apache.tiles.definition.NoSuchDefinitionException:
>
>       b) specify %{} in strust.xml file as show below
>
>          <action name="determineCaseEvaluationTypeForInput" >
>               <interceptor-ref name="redirectInput"/>
>           <result name="input" type="tiles">%{considTypeCode}</result>
>        </action>
>
>           In this case it is throwing the below mention exception
>  javax.servlet.ServletException:
> org.apache.tiles.definition.NoSuchDefinitionException:%{considTypeCode}
>
> In the debug mode , I can see the values of the considTypeCode and even I
> kept a hidden variable in the JSP that can assign the value again, I donno
> where the value is missing.
>
> If I keep type="chain" then an recursion excpetion is throw.
>
> Caused by: Infinite recursion detected:
> [/rating/saveInitConsiderationEval!saveInitConsiderationEval,
> /rating/determineCaseEvaluationTypeForInput,
> /rating/determineCaseEvaluationTypeForInput] - [unknown location]
>
> Any idea where I might have went wrong ?
>
>
> Thanks
> Siddiq.
>
>
>
>
> Greg Lindholm-2 wrote:
> >
> > On Fri, Oct 30, 2009 at 5:15 PM, Siddiq Syed <si...@yahoo.com>
> wrote:
> >
> >>
> >> First off all Thank you so much Greg, You have been doing a great job!.
> >> And
> >> you express things pretty clear, Which I may not.
> >> Please bare with me for some more time.
> >>
> >> When I am doing a chain in the input, as show below
> >>
> >>  <action name="saveInitConsiderationEval"
> >> class="com.activity.EvaluateCaseAction"
> >> method="saveInitConsiderationEval">
> >>                <interceptor-ref name="redirectInput"/>
> >>                <result name="success" type="redirect-action">
> >>                        determineCaseEvaluationType
> >>                </result>
> >>                <result name="input" type="chain">
> >>        determineCaseEvaluationTypeForInput
> >>        </result>
> >>        </action>
> >>
> >> The action "determineCaseEvaluationTypeForInput" is again looking for
> the
> >> input, in which case there is no input.
> >>
> >
> > Yes I see there is no 'input' and this is the problem.
> >
> > The way the struts validation framework works is the validators set error
> > messages if a validation fails and then the workflow interceptor checks
> to
> > see if there are any errors and sets the result to 'input' if there are
> > errors.
> >
> > So this is what is happening when you chain to action
> > determineCaseEvaluationTypeForInput, you have errors so workflow is
> > returning 'input', and this will happen before so your action method will
> > never be called.
> >
> > This is how the validation framework works, if you want to use it you
> must
> > supply 'input' result for any action that may have errors.
> >
> > One thing that may work for you is you don't have to hardcode the result
> > destination you can use and expression like this:
> >
> > <result name="input" type="tiles"> %{myDestination} </result>
> >
> > and have your action supply a getMyDestination() method.
> >
> > but remember your action execute method will not be called so you would
> > have
> > to do all your logic in either prepare() or prepareInput() methods.
> >
> > If you can't do this then I don't see how you can use the struts
> > validation
> > framework, you would have to manage errors yourself and remove the
> > workflow
> > interceptor from your stack.
> >
> >
> >
> >
> >>
> >>  <action name="determineCaseEvaluationTypeForInput"
> >> class="com.activity.EvaluateCaseAction"
> >> method="determineCaseEvaluationTypeForInput">
> >>                <result name="guidelInitConsid"
> >> type="tiles">editGuidelinesCaseEvaluation</result>
> >>                <result name="shrtsntcInitConsid"
> >> type="tiles">editShortSentenceCaseEvaluation</result>
> >>                <result name="sscat2p1InitConsid"
> >> type="tiles">editShortSentenceCaseEvaluation</result>
> >>                <result name="sscat2p2InitConsid"
> >> type="tiles">editShortSentenceCaseEvaluation</result>
> >> </action>
> >>
> >> <action name="determineCaseEvaluationType"
> >> class="com.activity.EvaluateCaseAction"
> >> method="determineCaseEvaluationType">
> >>                <result name="guidelInitConsid"
> >> type="tiles">editGuidelinesCaseEvaluation</result>
> >>                <result name="shrtsntcInitConsid"
> >> type="tiles">editShortSentenceCaseEvaluation</result>
> >>                <result name="sscat2p1InitConsid"
> >> type="tiles">editShortSentenceCaseEvaluation</result>
> >>                <result name="sscat2p2InitConsid"
> >> type="tiles">editShortSentenceCaseEvaluation</result>
> >>
> >> </action>
> >> ---- The question is pretty simple and in a simple view.
> >>
> >> I am displaying the JSP depend on the some string that action returns,
> >> When
> >> validation happens(fails) I want to display the same jsp with the
> >> validation
> >> message and the values.
> >>
> >> I hope you got my last sentece. I got an alternate for this by setting
> >> the
> >> request value in the getter and setter method of the view bean which is
> a
> >> bad approach , I know !! -:(
> >>
> >>
> >> Thanks
> >> Siddiq.
> >>
> >> Greg Lindholm-2 wrote:
> >> >
> >> > 1) Your interceptor stack is fine.
> >> >
> >> > 2) Dale was simply pointing out a very common newbie mistake; when you
> >> > specify an interceptor-ref in an action it will replace (not append)
> >> the
> >> > interceptor stack. Since you hadn't shown what redirectInput was it
> was
> >> a
> >> > possible source of error.  Now you have shown it, we can see it is OK.
> >> > (see
> >> > #1)
> >> >
> >> > 3) Result type of Chain is still probably the answer for you.  You say
> >> it
> >> > didn't work but don't describe what that means and what exactly you
> >> tried.
> >> > (see note below)
> >> >
> >> > 4) You should not need to iterate over
> >> > #session.RedirectMessageInterceptor_FieldErrors to get the errors from
> >> the
> >> > RedirectMessageInterceptor.  This is not the way it is meant to be
> >> used,
> >> > it's suppose to handle the messages automatically, that's the whole
> >> point
> >> > of
> >> > it.
> >> >
> >> > In order for RedirectMessageInterceptor to work properly you need to
> >> > always
> >> > include it in your interceptor stack on both the actions that generate
> >> the
> >> > messages and on the actions that get redirected to.  This is explained
> >> in
> >> > the doc and comments for RedirectMessageInterceptor.
> >> >
> >> > Note that the action that you redirect to, following a validation
> >> error,
> >> > will always use the 'input' result since the presents of the error
> >> > messages
> >> > will cause the workflow interceptor to return a result of 'input'.
>  You
> >> > might want to read this over a couple times to make sure you get it.
> >> The
> >> > action you redirect to will return a result of 'input' because the
> >> > workflow
> >> > interceptor sees that there are errors. (Maybe this is why you though
> >> > chain
> >> > wasn't working).
> >> >
> >> > You seem to have such an unusual configuration that you may have to
> >> > develop
> >> > your own solutions since the standard ones don't seem to work for you.
> >>  As
> >> > I
> >> > explained earlier, doing a redirect following a validation error is
> >> almost
> >> > always the wrong thing to do and the standard approach is to dispatch
> >> back
> >> > to the input page.
> >> >
> >> >
> >> > On Fri, Oct 30, 2009 at 1:57 PM, Siddiq Syed <si...@yahoo.com>
> >> wrote:
> >> >
> >> >>
> >> >> The interceptor mention is nothing but
> >> >> RedirectMessageInterceptor(
> >> >> http://glindholm.wordpress.com/category/struts-2/)
> >> >> and I specified that in the strust.xml,
> >> >> This interceptor is to preserve the error messages.
> >> >>
> >> >> <interceptors>
> >> >> <interceptor name="redirectMessage"
> >> >> class="com.interceptor.RedirectMessageInterceptor" />
> >> >>                        <interceptor-stack name="redirectInput">
> >> >>                                <interceptor-ref
> name="redirectMessage"
> >> />
> >> >>                                <interceptor-ref
> >> >> name="paramsPrepareParamsStack" />
> >> >>                        </interceptor-stack>
> >> >>                </interceptors>
> >> >> I am iterating the session in the JSP and displaying the error
> >> messages..
> >> >>
> >> >> <s:if test="#session.RedirectMessageInterceptor_FieldErrors != null">
> >> >> <ul>
> >> >>  <s:iterator value="#session.RedirectMessageInterceptor_FieldErrors"
> >
> >> >>        <s:iterator id="id" value="value" >
> >> >>        <li><s:property value="id" /></li>
> >> >>  </s:iterator>
> >> >> </s:iterator>
> >> >> </ul>
> >> >> <%
> >> >>
> >>  session.removeAttribute("RedirectMessageInterceptor_FieldErrors");
> >> >> %>
> >> >> </s:if>
> >> >>
> >> >> As I said my first attempt was to use Chain , but It was not working.
> >> >> And I don't understand what Dale is saying , can you elaborate
> please.
> >> >>
> >> >> Dale -- you mean to say chain and interceptor doesnot go together. !!
> >> -:(
> >> >>
> >> >>
> >> >> Thanks
> >> >> Siddiq.
> >> >>
> >> >>
> >> >> DNewfield wrote:
> >> >> >
> >> >> > Greg Lindholm wrote:
> >> >> >> The only other thing is your interceptor stack 'redirectInput' you
> >> >> >> haven't
> >> >> >> shown what it is.
> >> >> >
> >> >> > And note--specifying any interceptor(s) in the action causes the
> >> >> > specified interceptor(s) to be the only ones used.
> >> >> >
> >> >> > -Dale
> >> >> >
> >> >> >
> >> ---------------------------------------------------------------------
> >> >> > To unsubscribe, e-mail: user-unsubscribe@struts.apache.org
> >> >> > For additional commands, e-mail: user-help@struts.apache.org
> >> >> >
> >> >> >
> >> >> >
> >> >>
> >> >> --
> >> >> View this message in context:
> >> >>
> >>
> http://old.nabble.com/Preserving-Messages-and-Garbage-values-Across-a-Redirect-in-Struts-2-tp26114968p26134455.html
> >> >> Sent from the Struts - User mailing list archive at Nabble.com.
> >> >>
> >> >>
> >> >> ---------------------------------------------------------------------
> >> >> To unsubscribe, e-mail: user-unsubscribe@struts.apache.org
> >> >> For additional commands, e-mail: user-help@struts.apache.org
> >> >>
> >> >>
> >> >
> >> >
> >>
> >> --
> >> View this message in context:
> >>
> http://old.nabble.com/Preserving-Messages-and-Garbage-values-Across-a-Redirect-in-Struts-2-tp26114968p26136963.html
> >> Sent from the Struts - User mailing list archive at Nabble.com.
> >>
> >>
> >> ---------------------------------------------------------------------
> >> To unsubscribe, e-mail: user-unsubscribe@struts.apache.org
> >> For additional commands, e-mail: user-help@struts.apache.org
> >>
> >>
> >
> >
> :confused:
> --
> View this message in context:
> http://old.nabble.com/Preserving-Messages-and-Garbage-values-Across-a-Redirect-in-Struts-2-tp26114968p26157771.html
> Sent from the Struts - User mailing list archive at Nabble.com.
>
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: user-unsubscribe@struts.apache.org
> For additional commands, e-mail: user-help@struts.apache.org
>
>

Re: Preserving Messages and Garbage values Across a Redirect in Struts 2

Posted by Musachy Barroso <mu...@gmail.com>.
both ${} and %{} are supported in 2.1.x

On Mon, Nov 2, 2009 at 11:10 AM, Greg Lindholm <gr...@gmail.com> wrote:
> Here is the link [1] for "Parameters in configuration results", and yes it
> is suppose to be ${} not %{} (but I thought it had been changed to support
> %{}, hard to keep straight.) so you want to use 3a not 3b.
>
> You could show your getter, make sure it is public, returns a string and no
> typos.
> In the debugger you could break in prepare() make sure you are getting there
> and also break in the getter to see if it is being called.
>
> You need to go back to result type of chain and in the debugger trace
> through and find where your recursion is coming from.
>
>
>
> [1]
> http://struts.apache.org/2.x/docs/parameters-in-configuration-results.html
>
> On Mon, Nov 2, 2009 at 1:40 PM, Siddiq Syed <si...@yahoo.com> wrote:
>
>>
>> Hi Greg,
>>
>> Creating a variable in the action , seems not working.
>>
>> Here are the steps that i have done.
>>
>> step 1. Create a variable considTypeCode in the action , and so is getter
>> ,setter.
>> step 2. Create a prepare() method in the action, which sets the value of
>> the
>> considTypeCode to determine what will be the next page to display if
>> validation fails.
>>
>>
>> step 3.  a) specify ${} in struts.xml file as show below.
>>
>> <action name="saveInitConsiderationEval"
>> class="com.activity.EvaluateCaseAction" method="saveInitConsiderationEval">
>>                <interceptor-ref name="redirectInput"/>
>>                <result name="success" type="redirect-action">
>>                        determineCaseEvaluationType
>>                </result>
>>                 <result name="input" type="redirect-action">
>>            determineCaseEvaluationTypeForInput
>>        </result>
>>        </action>
>>           <action name="determineCaseEvaluationTypeForInput" >
>>               <interceptor-ref name="redirectInput"/>
>>           <result name="input" type="tiles">${considTypeCode}</result>
>>        </action>
>>
>>          In this case it is throwing the below mention exception
>>
>>      javax.servlet.ServletException:
>> org.apache.tiles.definition.NoSuchDefinitionException:
>>
>>       b) specify %{} in strust.xml file as show below
>>
>>          <action name="determineCaseEvaluationTypeForInput" >
>>               <interceptor-ref name="redirectInput"/>
>>           <result name="input" type="tiles">%{considTypeCode}</result>
>>        </action>
>>
>>           In this case it is throwing the below mention exception
>>  javax.servlet.ServletException:
>> org.apache.tiles.definition.NoSuchDefinitionException:%{considTypeCode}
>>
>> In the debug mode , I can see the values of the considTypeCode and even I
>> kept a hidden variable in the JSP that can assign the value again, I donno
>> where the value is missing.
>>
>> If I keep type="chain" then an recursion excpetion is throw.
>>
>> Caused by: Infinite recursion detected:
>> [/rating/saveInitConsiderationEval!saveInitConsiderationEval,
>> /rating/determineCaseEvaluationTypeForInput,
>> /rating/determineCaseEvaluationTypeForInput] - [unknown location]
>>
>> Any idea where I might have went wrong ?
>>
>>
>> Thanks
>> Siddiq.
>>
>>
>>
>>
>> Greg Lindholm-2 wrote:
>> >
>> > On Fri, Oct 30, 2009 at 5:15 PM, Siddiq Syed <si...@yahoo.com>
>> wrote:
>> >
>> >>
>> >> First off all Thank you so much Greg, You have been doing a great job!.
>> >> And
>> >> you express things pretty clear, Which I may not.
>> >> Please bare with me for some more time.
>> >>
>> >> When I am doing a chain in the input, as show below
>> >>
>> >>  <action name="saveInitConsiderationEval"
>> >> class="com.activity.EvaluateCaseAction"
>> >> method="saveInitConsiderationEval">
>> >>                <interceptor-ref name="redirectInput"/>
>> >>                <result name="success" type="redirect-action">
>> >>                        determineCaseEvaluationType
>> >>                </result>
>> >>                <result name="input" type="chain">
>> >>        determineCaseEvaluationTypeForInput
>> >>        </result>
>> >>        </action>
>> >>
>> >> The action "determineCaseEvaluationTypeForInput" is again looking for
>> the
>> >> input, in which case there is no input.
>> >>
>> >
>> > Yes I see there is no 'input' and this is the problem.
>> >
>> > The way the struts validation framework works is the validators set error
>> > messages if a validation fails and then the workflow interceptor checks
>> to
>> > see if there are any errors and sets the result to 'input' if there are
>> > errors.
>> >
>> > So this is what is happening when you chain to action
>> > determineCaseEvaluationTypeForInput, you have errors so workflow is
>> > returning 'input', and this will happen before so your action method will
>> > never be called.
>> >
>> > This is how the validation framework works, if you want to use it you
>> must
>> > supply 'input' result for any action that may have errors.
>> >
>> > One thing that may work for you is you don't have to hardcode the result
>> > destination you can use and expression like this:
>> >
>> > <result name="input" type="tiles"> %{myDestination} </result>
>> >
>> > and have your action supply a getMyDestination() method.
>> >
>> > but remember your action execute method will not be called so you would
>> > have
>> > to do all your logic in either prepare() or prepareInput() methods.
>> >
>> > If you can't do this then I don't see how you can use the struts
>> > validation
>> > framework, you would have to manage errors yourself and remove the
>> > workflow
>> > interceptor from your stack.
>> >
>> >
>> >
>> >
>> >>
>> >>  <action name="determineCaseEvaluationTypeForInput"
>> >> class="com.activity.EvaluateCaseAction"
>> >> method="determineCaseEvaluationTypeForInput">
>> >>                <result name="guidelInitConsid"
>> >> type="tiles">editGuidelinesCaseEvaluation</result>
>> >>                <result name="shrtsntcInitConsid"
>> >> type="tiles">editShortSentenceCaseEvaluation</result>
>> >>                <result name="sscat2p1InitConsid"
>> >> type="tiles">editShortSentenceCaseEvaluation</result>
>> >>                <result name="sscat2p2InitConsid"
>> >> type="tiles">editShortSentenceCaseEvaluation</result>
>> >> </action>
>> >>
>> >> <action name="determineCaseEvaluationType"
>> >> class="com.activity.EvaluateCaseAction"
>> >> method="determineCaseEvaluationType">
>> >>                <result name="guidelInitConsid"
>> >> type="tiles">editGuidelinesCaseEvaluation</result>
>> >>                <result name="shrtsntcInitConsid"
>> >> type="tiles">editShortSentenceCaseEvaluation</result>
>> >>                <result name="sscat2p1InitConsid"
>> >> type="tiles">editShortSentenceCaseEvaluation</result>
>> >>                <result name="sscat2p2InitConsid"
>> >> type="tiles">editShortSentenceCaseEvaluation</result>
>> >>
>> >> </action>
>> >> ---- The question is pretty simple and in a simple view.
>> >>
>> >> I am displaying the JSP depend on the some string that action returns,
>> >> When
>> >> validation happens(fails) I want to display the same jsp with the
>> >> validation
>> >> message and the values.
>> >>
>> >> I hope you got my last sentece. I got an alternate for this by setting
>> >> the
>> >> request value in the getter and setter method of the view bean which is
>> a
>> >> bad approach , I know !! -:(
>> >>
>> >>
>> >> Thanks
>> >> Siddiq.
>> >>
>> >> Greg Lindholm-2 wrote:
>> >> >
>> >> > 1) Your interceptor stack is fine.
>> >> >
>> >> > 2) Dale was simply pointing out a very common newbie mistake; when you
>> >> > specify an interceptor-ref in an action it will replace (not append)
>> >> the
>> >> > interceptor stack. Since you hadn't shown what redirectInput was it
>> was
>> >> a
>> >> > possible source of error.  Now you have shown it, we can see it is OK.
>> >> > (see
>> >> > #1)
>> >> >
>> >> > 3) Result type of Chain is still probably the answer for you.  You say
>> >> it
>> >> > didn't work but don't describe what that means and what exactly you
>> >> tried.
>> >> > (see note below)
>> >> >
>> >> > 4) You should not need to iterate over
>> >> > #session.RedirectMessageInterceptor_FieldErrors to get the errors from
>> >> the
>> >> > RedirectMessageInterceptor.  This is not the way it is meant to be
>> >> used,
>> >> > it's suppose to handle the messages automatically, that's the whole
>> >> point
>> >> > of
>> >> > it.
>> >> >
>> >> > In order for RedirectMessageInterceptor to work properly you need to
>> >> > always
>> >> > include it in your interceptor stack on both the actions that generate
>> >> the
>> >> > messages and on the actions that get redirected to.  This is explained
>> >> in
>> >> > the doc and comments for RedirectMessageInterceptor.
>> >> >
>> >> > Note that the action that you redirect to, following a validation
>> >> error,
>> >> > will always use the 'input' result since the presents of the error
>> >> > messages
>> >> > will cause the workflow interceptor to return a result of 'input'.
>>  You
>> >> > might want to read this over a couple times to make sure you get it.
>> >> The
>> >> > action you redirect to will return a result of 'input' because the
>> >> > workflow
>> >> > interceptor sees that there are errors. (Maybe this is why you though
>> >> > chain
>> >> > wasn't working).
>> >> >
>> >> > You seem to have such an unusual configuration that you may have to
>> >> > develop
>> >> > your own solutions since the standard ones don't seem to work for you.
>> >>  As
>> >> > I
>> >> > explained earlier, doing a redirect following a validation error is
>> >> almost
>> >> > always the wrong thing to do and the standard approach is to dispatch
>> >> back
>> >> > to the input page.
>> >> >
>> >> >
>> >> > On Fri, Oct 30, 2009 at 1:57 PM, Siddiq Syed <si...@yahoo.com>
>> >> wrote:
>> >> >
>> >> >>
>> >> >> The interceptor mention is nothing but
>> >> >> RedirectMessageInterceptor(
>> >> >> http://glindholm.wordpress.com/category/struts-2/)
>> >> >> and I specified that in the strust.xml,
>> >> >> This interceptor is to preserve the error messages.
>> >> >>
>> >> >> <interceptors>
>> >> >> <interceptor name="redirectMessage"
>> >> >> class="com.interceptor.RedirectMessageInterceptor" />
>> >> >>                        <interceptor-stack name="redirectInput">
>> >> >>                                <interceptor-ref
>> name="redirectMessage"
>> >> />
>> >> >>                                <interceptor-ref
>> >> >> name="paramsPrepareParamsStack" />
>> >> >>                        </interceptor-stack>
>> >> >>                </interceptors>
>> >> >> I am iterating the session in the JSP and displaying the error
>> >> messages..
>> >> >>
>> >> >> <s:if test="#session.RedirectMessageInterceptor_FieldErrors != null">
>> >> >> <ul>
>> >> >>  <s:iterator value="#session.RedirectMessageInterceptor_FieldErrors"
>> >
>> >> >>        <s:iterator id="id" value="value" >
>> >> >>        <li><s:property value="id" /></li>
>> >> >>  </s:iterator>
>> >> >> </s:iterator>
>> >> >> </ul>
>> >> >> <%
>> >> >>
>> >>  session.removeAttribute("RedirectMessageInterceptor_FieldErrors");
>> >> >> %>
>> >> >> </s:if>
>> >> >>
>> >> >> As I said my first attempt was to use Chain , but It was not working.
>> >> >> And I don't understand what Dale is saying , can you elaborate
>> please.
>> >> >>
>> >> >> Dale -- you mean to say chain and interceptor doesnot go together. !!
>> >> -:(
>> >> >>
>> >> >>
>> >> >> Thanks
>> >> >> Siddiq.
>> >> >>
>> >> >>
>> >> >> DNewfield wrote:
>> >> >> >
>> >> >> > Greg Lindholm wrote:
>> >> >> >> The only other thing is your interceptor stack 'redirectInput' you
>> >> >> >> haven't
>> >> >> >> shown what it is.
>> >> >> >
>> >> >> > And note--specifying any interceptor(s) in the action causes the
>> >> >> > specified interceptor(s) to be the only ones used.
>> >> >> >
>> >> >> > -Dale
>> >> >> >
>> >> >> >
>> >> ---------------------------------------------------------------------
>> >> >> > To unsubscribe, e-mail: user-unsubscribe@struts.apache.org
>> >> >> > For additional commands, e-mail: user-help@struts.apache.org
>> >> >> >
>> >> >> >
>> >> >> >
>> >> >>
>> >> >> --
>> >> >> View this message in context:
>> >> >>
>> >>
>> http://old.nabble.com/Preserving-Messages-and-Garbage-values-Across-a-Redirect-in-Struts-2-tp26114968p26134455.html
>> >> >> Sent from the Struts - User mailing list archive at Nabble.com.
>> >> >>
>> >> >>
>> >> >> ---------------------------------------------------------------------
>> >> >> To unsubscribe, e-mail: user-unsubscribe@struts.apache.org
>> >> >> For additional commands, e-mail: user-help@struts.apache.org
>> >> >>
>> >> >>
>> >> >
>> >> >
>> >>
>> >> --
>> >> View this message in context:
>> >>
>> http://old.nabble.com/Preserving-Messages-and-Garbage-values-Across-a-Redirect-in-Struts-2-tp26114968p26136963.html
>> >> Sent from the Struts - User mailing list archive at Nabble.com.
>> >>
>> >>
>> >> ---------------------------------------------------------------------
>> >> To unsubscribe, e-mail: user-unsubscribe@struts.apache.org
>> >> For additional commands, e-mail: user-help@struts.apache.org
>> >>
>> >>
>> >
>> >
>> :confused:
>> --
>> View this message in context:
>> http://old.nabble.com/Preserving-Messages-and-Garbage-values-Across-a-Redirect-in-Struts-2-tp26114968p26157771.html
>> Sent from the Struts - User mailing list archive at Nabble.com.
>>
>>
>> ---------------------------------------------------------------------
>> To unsubscribe, e-mail: user-unsubscribe@struts.apache.org
>> For additional commands, e-mail: user-help@struts.apache.org
>>
>>
>

---------------------------------------------------------------------
To unsubscribe, e-mail: user-unsubscribe@struts.apache.org
For additional commands, e-mail: user-help@struts.apache.org


Re: Preserving Messages and Garbage values Across a Redirect in Struts 2

Posted by Siddiq Syed <si...@yahoo.com>.
I don't have any idea why input is throwing this expception.
 

I tried keep the break point in the debug ...but you hardly find where the flow goes.

when  click on submit with garbage values , first getter,setter methods, than prepare methods than it goes to struts.xml and then come back to getter setter....so on !!

As per my understanding , chain is taking the interceport every time and , every time chain call it find the error in the inpterceptor and keep forwarding to the input. 

God save us from this chain !!

<action name="saveInitConsiderationEval" class="com.activity.EvaluateCaseAction" method="saveInitConsiderationEval">
<interceptor-ref name="redirectInput"/><result name="success" type="redirect-action"><param name="actionName">determineCaseEvaluationType</param></result><result name="input" type="chain">determineCaseEvaluationTypeForInput</result><action name="determineCaseEvaluationTypeForInput" class="com.activity.EvaluateCaseAction" ><interceptor-ref name="redirectInput"/><result name="input" type="tiles">${considTypeCode}</result></action>
 
 
 
 </action>
Thanks
Siddiq.



________________________________
From: Greg Lindholm <gr...@gmail.com>
To: Struts Users Mailing List <us...@struts.apache.org>
Sent: Mon, November 2, 2009 2:10:57 PM
Subject: Re: Preserving Messages and Garbage values Across a Redirect in Struts 2

Here is the link [1] for "Parameters in configuration results", and yes it
is suppose to be ${} not %{} (but I thought it had been changed to support
%{}, hard to keep straight.) so you want to use 3a not 3b.

You could show your getter, make sure it is public, returns a string and no
typos.
In the debugger you could break in prepare() make sure you are getting there
and also break in the getter to see if it is being called.

You need to go back to result type of chain and in the debugger trace
through and find where your recursion is coming from.



[1]
http://struts.apache.org/2.x/docs/parameters-in-configuration-results.html

On Mon, Nov 2, 2009 at 1:40 PM, Siddiq Syed <si...@yahoo.com> wrote:

>
> Hi Greg,
>
> Creating a variable in the action , seems not working.
>
> Here are the steps that i have done.
>
> step 1. Create a variable considTypeCode in the action , and so is getter
> ,setter.
> step 2. Create a prepare() method in the action, which sets the value of
> the
> considTypeCode to determine what will be the next page to display if
> validation fails.
>
>
> step 3.  a) specify ${} in struts.xml file as show below.
>
> <action name="saveInitConsiderationEval"
> class="com.activity.EvaluateCaseAction" method="saveInitConsiderationEval">
>                <interceptor-ref name="redirectInput"/>
>                <result name="success" type="redirect-action">
>                        determineCaseEvaluationType
>                </result>
>                <result name="input" type="redirect-action">
>            determineCaseEvaluationTypeForInput
>        </result>
>        </action>
>          <action name="determineCaseEvaluationTypeForInput" >
>              <interceptor-ref name="redirectInput"/>
>          <result name="input" type="tiles">${considTypeCode}</result>
>        </action>
>
>          In this case it is throwing the below mention exception
>
>      javax.servlet.ServletException:
> org.apache.tiles.definition.NoSuchDefinitionException:
>
>      b) specify %{} in strust.xml file as show below
>
>          <action name="determineCaseEvaluationTypeForInput" >
>              <interceptor-ref name="redirectInput"/>
>          <result name="input" type="tiles">%{considTypeCode}</result>
>        </action>
>
>          In this case it is throwing the below mention exception
>  javax.servlet.ServletException:
> org.apache.tiles.definition.NoSuchDefinitionException:%{considTypeCode}
>
> In the debug mode , I can see the values of the considTypeCode and even I
> kept a hidden variable in the JSP that can assign the value again, I donno
> where the value is missing.
>
> If I keep type="chain" then an recursion excpetion is throw.
>
> Caused by: Infinite recursion detected:
> [/rating/saveInitConsiderationEval!saveInitConsiderationEval,
> /rating/determineCaseEvaluationTypeForInput,
> /rating/determineCaseEvaluationTypeForInput] - [unknown location]
>
> Any idea where I might have went wrong ?
>
>
> Thanks
> Siddiq.
>
>
>
>
> Greg Lindholm-2 wrote:
> >
> > On Fri, Oct 30, 2009 at 5:15 PM, Siddiq Syed <si...@yahoo.com>
> wrote:
> >
> >>
> >> First off all Thank you so much Greg, You have been doing a great job!.
> >> And
> >> you express things pretty clear, Which I may not.
> >> Please bare with me for some more time.
> >>
> >> When I am doing a chain in the input, as show below
> >>
> >>  <action name="saveInitConsiderationEval"
> >> class="com.activity.EvaluateCaseAction"
> >> method="saveInitConsiderationEval">
> >>                <interceptor-ref name="redirectInput"/>
> >>                <result name="success" type="redirect-action">
> >>                        determineCaseEvaluationType
> >>                </result>
> >>                <result name="input" type="chain">
> >>        determineCaseEvaluationTypeForInput
> >>        </result>
> >>        </action>
> >>
> >> The action "determineCaseEvaluationTypeForInput" is again looking for
> the
> >> input, in which case there is no input.
> >>
> >
> > Yes I see there is no 'input' and this is the problem.
> >
> > The way the struts validation framework works is the validators set error
> > messages if a validation fails and then the workflow interceptor checks
> to
> > see if there are any errors and sets the result to 'input' if there are
> > errors.
> >
> > So this is what is happening when you chain to action
> > determineCaseEvaluationTypeForInput, you have errors so workflow is
> > returning 'input', and this will happen before so your action method will
> > never be called.
> >
> > This is how the validation framework works, if you want to use it you
> must
> > supply 'input' result for any action that may have errors.
> >
> > One thing that may work for you is you don't have to hardcode the result
> > destination you can use and expression like this:
> >
> > <result name="input" type="tiles"> %{myDestination} </result>
> >
> > and have your action supply a getMyDestination() method.
> >
> > but remember your action execute method will not be called so you would
> > have
> > to do all your logic in either prepare() or prepareInput() methods.
> >
> > If you can't do this then I don't see how you can use the struts
> > validation
> > framework, you would have to manage errors yourself and remove the
> > workflow
> > interceptor from your stack.
> >
> >
> >
> >
> >>
> >>  <action name="determineCaseEvaluationTypeForInput"
> >> class="com.activity.EvaluateCaseAction"
> >> method="determineCaseEvaluationTypeForInput">
> >>                <result name="guidelInitConsid"
> >> type="tiles">editGuidelinesCaseEvaluation</result>
> >>                <result name="shrtsntcInitConsid"
> >> type="tiles">editShortSentenceCaseEvaluation</result>
> >>                <result name="sscat2p1InitConsid"
> >> type="tiles">editShortSentenceCaseEvaluation</result>
> >>                <result name="sscat2p2InitConsid"
> >> type="tiles">editShortSentenceCaseEvaluation</result>
> >> </action>
> >>
> >> <action name="determineCaseEvaluationType"
> >> class="com.activity.EvaluateCaseAction"
> >> method="determineCaseEvaluationType">
> >>                <result name="guidelInitConsid"
> >> type="tiles">editGuidelinesCaseEvaluation</result>
> >>                <result name="shrtsntcInitConsid"
> >> type="tiles">editShortSentenceCaseEvaluation</result>
> >>                <result name="sscat2p1InitConsid"
> >> type="tiles">editShortSentenceCaseEvaluation</result>
> >>                <result name="sscat2p2InitConsid"
> >> type="tiles">editShortSentenceCaseEvaluation</result>
> >>
> >> </action>
> >> ---- The question is pretty simple and in a simple view.
> >>
> >> I am displaying the JSP depend on the some string that action returns,
> >> When
> >> validation happens(fails) I want to display the same jsp with the
> >> validation
> >> message and the values.
> >>
> >> I hope you got my last sentece. I got an alternate for this by setting
> >> the
> >> request value in the getter and setter method of the view bean which is
> a
> >> bad approach , I know !! -:(
> >>
> >>
> >> Thanks
> >> Siddiq.
> >>
> >> Greg Lindholm-2 wrote:
> >> >
> >> > 1) Your interceptor stack is fine.
> >> >
> >> > 2) Dale was simply pointing out a very common newbie mistake; when you
> >> > specify an interceptor-ref in an action it will replace (not append)
> >> the
> >> > interceptor stack. Since you hadn't shown what redirectInput was it
> was
> >> a
> >> > possible source of error.  Now you have shown it, we can see it is OK.
> >> > (see
> >> > #1)
> >> >
> >> > 3) Result type of Chain is still probably the answer for you.  You say
> >> it
> >> > didn't work but don't describe what that means and what exactly you
> >> tried.
> >> > (see note below)
> >> >
> >> > 4) You should not need to iterate over
> >> > #session.RedirectMessageInterceptor_FieldErrors to get the errors from
> >> the
> >> > RedirectMessageInterceptor.  This is not the way it is meant to be
> >> used,
> >> > it's suppose to handle the messages automatically, that's the whole
> >> point
> >> > of
> >> > it.
> >> >
> >> > In order for RedirectMessageInterceptor to work properly you need to
> >> > always
> >> > include it in your interceptor stack on both the actions that generate
> >> the
> >> > messages and on the actions that get redirected to.  This is explained
> >> in
> >> > the doc and comments for RedirectMessageInterceptor.
> >> >
> >> > Note that the action that you redirect to, following a validation
> >> error,
> >> > will always use the 'input' result since the presents of the error
> >> > messages
> >> > will cause the workflow interceptor to return a result of 'input'.
>  You
> >> > might want to read this over a couple times to make sure you get it.
> >> The
> >> > action you redirect to will return a result of 'input' because the
> >> > workflow
> >> > interceptor sees that there are errors. (Maybe this is why you though
> >> > chain
> >> > wasn't working).
> >> >
> >> > You seem to have such an unusual configuration that you may have to
> >> > develop
> >> > your own solutions since the standard ones don't seem to work for you.
> >>  As
> >> > I
> >> > explained earlier, doing a redirect following a validation error is
> >> almost
> >> > always the wrong thing to do and the standard approach is to dispatch
> >> back
> >> > to the input page.
> >> >
> >> >
> >> > On Fri, Oct 30, 2009 at 1:57 PM, Siddiq Syed <si...@yahoo.com>
> >> wrote:
> >> >
> >> >>
> >> >> The interceptor mention is nothing but
> >> >> RedirectMessageInterceptor(
> >> >> http://glindholm.wordpress.com/category/struts-2/)
> >> >> and I specified that in the strust.xml,
> >> >> This interceptor is to preserve the error messages.
> >> >>
> >> >> <interceptors>
> >> >> <interceptor name="redirectMessage"
> >> >> class="com.interceptor.RedirectMessageInterceptor" />
> >> >>                        <interceptor-stack name="redirectInput">
> >> >>                                <interceptor-ref
> name="redirectMessage"
> >> />
> >> >>                                <interceptor-ref
> >> >> name="paramsPrepareParamsStack" />
> >> >>                        </interceptor-stack>
> >> >>                </interceptors>
> >> >> I am iterating the session in the JSP and displaying the error
> >> messages..
> >> >>
> >> >> <s:if test="#session.RedirectMessageInterceptor_FieldErrors != null">
> >> >> <ul>
> >> >>  <s:iterator value="#session.RedirectMessageInterceptor_FieldErrors"
> >
> >> >>        <s:iterator id="id" value="value" >
> >> >>        <li><s:property value="id" /></li>
> >> >>  </s:iterator>
> >> >> </s:iterator>
> >> >> </ul>
> >> >> <%
> >> >>
> >>  session.removeAttribute("RedirectMessageInterceptor_FieldErrors");
> >> >> %>
> >> >> </s:if>
> >> >>
> >> >> As I said my first attempt was to use Chain , but It was not working.
> >> >> And I don't understand what Dale is saying , can you elaborate
> please.
> >> >>
> >> >> Dale -- you mean to say chain and interceptor doesnot go together. !!
> >> -:(
> >> >>
> >> >>
> >> >> Thanks
> >> >> Siddiq.
> >> >>
> >> >>
> >> >> DNewfield wrote:
> >> >> >
> >> >> > Greg Lindholm wrote:
> >> >> >> The only other thing is your interceptor stack 'redirectInput' you
> >> >> >> haven't
> >> >> >> shown what it is.
> >> >> >
> >> >> > And note--specifying any interceptor(s) in the action causes the
> >> >> > specified interceptor(s) to be the only ones used.
> >> >> >
> >> >> > -Dale
> >> >> >
> >> >> >
> >> ---------------------------------------------------------------------
> >> >> > To unsubscribe, e-mail: user-unsubscribe@struts.apache.org
> >> >> > For additional commands, e-mail: user-help@struts.apache.org
> >> >> >
> >> >> >
> >> >> >
> >> >>
> >> >> --
> >> >> View this message in context:
> >> >>
> >>
> http://old.nabble.com/Preserving-Messages-and-Garbage-values-Across-a-Redirect-in-Struts-2-tp26114968p26134455.html
> >> >> Sent from the Struts - User mailing list archive at Nabble.com.
> >> >>
> >> >>
> >> >> ---------------------------------------------------------------------
> >> >> To unsubscribe, e-mail: user-unsubscribe@struts.apache.org
> >> >> For additional commands, e-mail: user-help@struts.apache.org
> >> >>
> >> >>
> >> >
> >> >
> >>
> >> --
> >> View this message in context:
> >>
> http://old.nabble.com/Preserving-Messages-and-Garbage-values-Across-a-Redirect-in-Struts-2-tp26114968p26136963.html
> >> Sent from the Struts - User mailing list archive at Nabble.com.
> >>
> >>
> >> ---------------------------------------------------------------------
> >> To unsubscribe, e-mail: user-unsubscribe@struts.apache.org
> >> For additional commands, e-mail: user-help@struts.apache.org
> >>
> >>
> >
> >
> :confused:
> --
> View this message in context:
> http://old.nabble.com/Preserving-Messages-and-Garbage-values-Across-a-Redirect-in-Struts-2-tp26114968p26157771.html
> Sent from the Struts - User mailing list archive at Nabble.com.
>
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: user-unsubscribe@struts.apache.org
> For additional commands, e-mail: user-help@struts.apache.org
>
>

Caused by: Infinite recursion detected: