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

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

Okay, I figured out why it doesn't work for me, but it is working for everyone 
else.  I have my struts configured to propagate OgnlExceptions. By default they 
are swallowed, so the exception I showed in the original bug report is dropped 
and the rendering continues just fine (I verified this by turning off the 
propagation of OgnlExceptions locally).

You can verify it by putting a breakpoint in 
OgnlValueStack.handleOgnlException(), and you will see that the only reason it 
is working for you is that throwExceptionOnFailure is false. 

My patch above will remove this as an issue for those of us who want to see 
OgnlExceptions (when I turned this on I found a lot of bugs in our code that 
had been previously masked.)  

Thanks!


> 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