struts-issues mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Chris Cranford (JIRA)" <j...@apache.org>
Subject [jira] [Comment Edited] (WW-4066) Submitting form with parameters using brackets while devMode=true yields StringIndexOutOfBoundsException
Date Fri, 24 May 2013 17:38:24 GMT

    [ https://issues.apache.org/jira/browse/WW-4066?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=13666479#comment-13666479
] 

Chris Cranford edited comment on WW-4066 at 5/24/13 5:37 PM:
-------------------------------------------------------------

One of the reasons why our base action overrides the action errors, message, and field message
methods was because it allowed us to simply call {{addActionMessage("some.message");}} without
having to wrap the message itself using {{getText}}.  That part is what has worked up until
the latest builds.  

What I'll propose to our team is that we'll modify all actions to make use of the {{getText()}}
call within each action where we pass a message to the methods that we were originally overriding
and remove their overrides from the base action.  That should bring the code base in line
with the expectations and avoid the {{StringIndexOutOfBoundsException}} error.

But what still troubles me with this is related to the developer notifications themselves.

I modified the {{ItemSearchAction}} as follows:
{code}
public ItemSearchAction() {
  this.criteria = new ItemSearchCriteria();
}
{code}

Technically, that should instantiate the model prior to any method invocations on the action
itself in a similar fashion as your interceptor proposal would insure the model is created
before trying to set the parameters on the action.  But unfortunately, when I display the
action messages which resulted from the form submission to the action, I still get notifications
that there were issues with all the form elements.

Looking at the tags used in the form itself, the submit tag doesn't dictate any attributes
as required.  We typically use the key attribute so that it does the localization lookup for
the value attribute.  Using key also sets the name attribute of the tag but with the non-localization
value.  When using key='button.search', I end up with the following:
{code}<input type='submit' id='form_button_search' name='button.search' value='Search'>{code}

Following your developer notifications, that implies I need some object called 'button' inside
the model with a property called 'search'.  Is the use of the key attribute of a submit tag
with a phrase that contains a '.' when the action implements the {{ModelDriven<T>}}
interface not possible without generating these warnings?  

It seems the only viable options here is either A) don't use a '.' in the key names, B) modify
the model to contain the hierarchy so use of '.' is possible, or C) don't use the key attribute
at all and simply use the value attribute where it contains: {code}value='%{getText('button.search')}'{code}
What do you suggest?

Lastly, I still can't seem to submit the values for the itemConditionTypes, itemNumberTypes,
itemNumbers, and itemSearchTypes arrays and the excel property without the developer notifications
even when the model is instantiated upon the creation of the action itself.

Are we sure that creating the model with your above proposed solution will 'fix' my test case?

To clarify - I had not yet removed the 'paramsPrepareParamsStack' interceptor reference as
you had indicated you had done.  In doing so and using the default struts interceptor stack,
I no longer get warnings regarding anything except for the search button even if I instantiate
the model during action creation or not.

So I understand your point about needing to somehow alter the 'paramsPrepareParamsStack' but
the default stack seems to work as intended.  I'll have to check why we chose to use that
particular interceptor stack rather than the default.  But can you elaborate on the issue
regarding the submit tag and how best to fix it related to the developer notifications?


                
      was (Author: crancran):
    One of the reasons why our base action overrides the action errors, message, and field
message methods was because it allowed us to simply call {{addActionMessage("some.message");}}
without having to wrap the message itself using {{getText}}.  That part is what has worked
up until the latest builds.  

What I'll propose to our team is that we'll modify all actions to make use of the {{getText()}}
call within each action where we pass a message to the methods that we were originally overriding
and remove their overrides from the base action.  That should bring the code base in line
with the expectations and avoid the {{StringIndexOutOfBoundsException}} error.

But what still troubles me with this is related to the developer notifications themselves.

I modified the {{ItemSearchAction}} as follows:
{code}
public ItemSearchAction() {
  this.criteria = new ItemSearchCriteria();
}
{code}

Technically, that should instantiate the model prior to any method invocations on the action
itself in a similar fashion as your interceptor proposal would insure the model is created
before trying to set the parameters on the action.  But unfortunately, when I display the
action messages which resulted from the form submission to the action, I still get notifications
that there were issues with all the form elements.

Looking at the tags used in the form itself, the submit tag doesn't dictate any attributes
as required.  We typically use the key attribute so that it does the localization lookup for
the value attribute.  Using key also sets the name attribute of the tag but with the non-localization
value.  When using key='button.search', I end up with the following:
{code}<input type='submit' id='form_button_search' name='button.search' value='Search'>{code}

Following your developer notifications, that implies I need some object called 'button' inside
the model with a property called 'search'.  Is the use of the key attribute of a submit tag
with a phrase that contains a '.' when the action implements the {{ModelDriven<T>}}
interface not possible without generating these warnings?  

It seems the only viable options here is either A) don't use a '.' in the key names, B) modify
the model to contain the hierarchy so use of '.' is possible, or C) don't use the key attribute
at all and simply use the value attribute where it contains: {code}value='%{getText('button.search')}'{code}
What do you suggest?

Lastly, I still can't seem to submit the values for the itemConditionTypes, itemNumberTypes,
itemNumbers, and itemSearchTypes arrays and the excel property without the developer notifications
even when the model is instantiated upon the creation of the action itself.

Are we sure that creating the model with your above proposed solution will 'fix' my test case?




                  
> Submitting form with parameters using brackets while devMode=true yields StringIndexOutOfBoundsException
> --------------------------------------------------------------------------------------------------------
>
>                 Key: WW-4066
>                 URL: https://issues.apache.org/jira/browse/WW-4066
>             Project: Struts 2
>          Issue Type: Bug
>          Components: Core Actions
>    Affects Versions: 2.3.14
>            Reporter: Chris Cranford
>            Assignee: Lukasz Lenart
>             Fix For: 2.3.16
>
>         Attachments: testcase.zip
>
>
> Our BaseAction which extends ActionSupport overrides the addActionMessage() with the
following:
> {code:java}
> @Override
> public void addActionMessage(String message) {
>   super.addActionMessage(getText(message));
> }
> {code}
> With the above method in place during devMode=true, the following error stack trace occurs:
> {noformat}
> java.lang.StringIndexOutOfBoundsException: String index out of range: -1
>   at java.lang.String.substring(String.java:1871)
>   at com.opensymphony.xwork2.util.LocalizedTextUtil.findText(LocalizedTextUtil.java:426)
>   at com.opensymphony.xwork2.util.LocalizedTextUtil.findText(LocalizedTextUtil.java:362)
>   at com.opensymphony.xwork2.TextProviderSupport.getText(TextProviderSupport.java:208)
>   at com.opensymphony.xwork2.TextProviderSupport.getText(TextProviderSupport.java:123)
>   at com.opensymphony.xwork2.ActionSupport.getText(ActionSupport.java:103)
>   at com.setech.dw.common.web.BaseAction.addActionMessage(BaseAction.java:209)
>   at com.opensymphony.xwork2.interceptor.ParametersInterceptor.setParameters(ParametersInterceptor.java:337)
>   at com.opensymphony.xwork2.interceptor.ParametersInterceptor.doIntercept(ParametersInterceptor.java:241)
> {noformat}

--
This message is automatically generated by JIRA.
If you think it was sent incorrectly, please contact your JIRA administrators
For more information on JIRA, see: http://www.atlassian.com/software/jira

Mime
View raw message