struts-issues mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Aleksandr Mashchenko (JIRA)" <j...@apache.org>
Subject [jira] [Commented] (WW-4493) Still can't pass parameters with dashes to tags
Date Tue, 28 Apr 2015 19:07:07 GMT

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

Aleksandr Mashchenko commented on WW-4493:
------------------------------------------

[~perfnorm] I've successfully run you snippet with the latest Struts2 snapshot version and
with 2.3.20 with the latest FreeMarker. When do you get this exception? Where and how do you
use this ftl snippet?

> 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
>              Labels: freemarker, tags
>             Fix For: 2.3.24
>
>
> 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)

Mime
View raw message