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)

Reply via email to