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

Jasper Rosenberg commented on WW-4493:
--------------------------------------

I'm sorry but I'm 99% sure he is mistaken.  I am already using the latest 
compatibility, but that shouldn't matter anyway because this isn't a freemarker 
regression issue.  With the latest struts and freemarker, the attributes with 
dashes are successfully passed through.  The remaining bug is how the struts ui 
component tries to use ognl to set them in the parameter map.  That shoul be 
easily fixed by my suggested patch.

> 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)

Reply via email to