Jasper Rosenberg created WW-4493:
------------------------------------
Summary: Still can't pass parameters with dashes to tags
Key: WW-4493
URL: https://issues.apache.org/jira/browse/WW-4493
Project: Struts 2
Issue Type: Bug
Components: Expression Language
Affects Versions: 2.3.23
Reporter: Jasper Rosenberg
Priority: Minor
The latest freemarker now supports dashes in attribute names, so I can write
something like:
{code:xml}
<@s.form name="sendToPhone" data\-ajax="false">
</@s.form>
{code}
Unfortunately, the parameters are set using ognl internally, so it blows up
with an error like:
{noformat}
Caused by: ognl.InappropriateExpressionException: Inappropriate OGNL
expression: data - ajax
at ognl.SimpleNode.setValueBody(SimpleNode.java:312)
at ognl.SimpleNode.evaluateSetValueBody(SimpleNode.java:220)
at ognl.SimpleNode.setValue(SimpleNode.java:301)
at ognl.Ognl.setValue(Ognl.java:737)
at com.opensymphony.xwork2.ognl.OgnlUtil$1.execute(OgnlUtil.java:287)
at com.opensymphony.xwork2.ognl.OgnlUtil$1.execute(OgnlUtil.java:282)
at
com.opensymphony.xwork2.ognl.OgnlUtil.compileAndExecute(OgnlUtil.java:340)
at com.opensymphony.xwork2.ognl.OgnlUtil.setValue(OgnlUtil.java:282)
{noformat}
I think there is a simple solution, which is to send any parameters with an
dash directly to the parameters map like so:
{code:title=Component.java|borderStyle=solid}
/**
* Pushes this component's parameter Map as well as the component itself on
to the stack
* and then copies the supplied parameters over. Because the component's
parameter Map is
* pushed before the component itself, any key-value pair that can't be
assigned to component
* will be set in the parameters Map.
*
* @param params the parameters to copy.
*/
public void copyParams(Map params) {
stack.push(parameters);
stack.push(this);
try {
for (Object o : params.entrySet()) {
Map.Entry entry = (Map.Entry) o;
String key = (String) entry.getKey();
if (key.indexOf('-') >= 0) {
// UI component attributes may contain hypens (e.g.
data-ajax), but ognl
// can't handle that, and there can't be a component
property with a hypen
// so into the parameters map it goes.
parameters.put(key, entry.getValue());
} else {
stack.setValue(key, entry.getValue());
}
}
} finally {
stack.pop();
stack.pop();
}
}
{code}
Hoping this can make it into 2.3.24, thanks!
--
This message was sent by Atlassian JIRA
(v6.3.4#6332)