You are viewing a plain text version of this content. The canonical link for it is here.
Posted to issues@struts.apache.org by "Lukasz Lenart (Jira)" <ji...@apache.org> on 2023/06/28 07:00:00 UTC

[jira] [Updated] (WW-4062) Invalid OGNL expressions are not cached

     [ https://issues.apache.org/jira/browse/WW-4062?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]

Lukasz Lenart updated WW-4062:
------------------------------
    Fix Version/s: 6.4.0
                       (was: 6.2.0)

> Invalid OGNL expressions are not cached
> ---------------------------------------
>
>                 Key: WW-4062
>                 URL: https://issues.apache.org/jira/browse/WW-4062
>             Project: Struts 2
>          Issue Type: Bug
>          Components: Value Stack
>    Affects Versions: 2.3.14
>            Reporter: Saulius Tvarijonas
>            Priority: Major
>             Fix For: 6.4.0
>
>         Attachments: WW-4062.PNG
>
>
> I am using velocity to render results page. During performance optimizations I noticed significant memory usage from *com.opensymphony.xwork2.ognl.OgnlUtil#compile*. There is caching implemented in OgnlUtil, but if expression compilation fails, it is not cached.
> I am not really sure if this problem is in struts or velocity engine. But situation is following:
> # In velocity template trying to render string *<p>$!foo</p>*
> # If value is null, velocity calls *org.apache.velocity.runtime.parser.node.ASTReference#getNullString*
> # Internally there is call to *context.get(".literal." + nullString)*
> # And this ".literal." expression always reaches *OgnlUtil#compile* and compilation fails.
> Below is stacktrace for more details:
> {code}
> at com.opensymphony.xwork2.ognl.OgnlUtil.compile(OgnlUtil.java:248)
> at com.opensymphony.xwork2.ognl.OgnlUtil.getValue(OgnlUtil.java:236)
> at com.opensymphony.xwork2.ognl.OgnlValueStack.getValueUsingOgnl(OgnlValueStack.java:291)
> at com.opensymphony.xwork2.ognl.OgnlValueStack.tryFindValue(OgnlValueStack.java:274)
> at com.opensymphony.xwork2.ognl.OgnlValueStack.tryFindValueWhenExpressionIsNotNull(OgnlValueStack.java:256)
> at com.opensymphony.xwork2.ognl.OgnlValueStack.findValue(OgnlValueStack.java:236)
> at com.opensymphony.xwork2.ognl.OgnlValueStack.findValue(OgnlValueStack.java:298)
> at org.apache.struts2.dispatcher.StrutsRequestWrapper.getAttribute(StrutsRequestWrapper.java:82)
> at org.apache.velocity.tools.view.context.ChainedContext.getAttribute(Unknown Source:-1)
> at org.apache.velocity.tools.view.context.ChainedContext.internalGet(Unknown Source:-1)
> at org.apache.velocity.context.AbstractContext.get(AbstractContext.java:193)
> at org.apache.velocity.context.InternalContextAdapterImpl.get(InternalContextAdapterImpl.java:267)
> at org.apache.velocity.runtime.parser.node.ASTReference.getNullString(ASTReference.java:510)
> at org.apache.velocity.runtime.parser.node.ASTReference.render(ASTReference.java:465)
> at org.apache.velocity.runtime.parser.node.SimpleNode.render(SimpleNode.java:342)
> at org.apache.velocity.runtime.parser.node.ASTStringLiteral.value(ASTStringLiteral.java:330)
> at org.apache.velocity.runtime.parser.node.ASTExpression.value(ASTExpression.java:71)
> at org.apache.velocity.runtime.parser.node.ASTSetDirective.render(ASTSetDirective.java:142)
> at org.apache.velocity.runtime.parser.node.SimpleNode.render(SimpleNode.java:342)
> at org.apache.velocity.runtime.directive.Parse.render(Parse.java:260)
> at org.apache.velocity.runtime.parser.node.ASTDirective.render(ASTDirective.java:207)
> at org.apache.velocity.runtime.parser.node.SimpleNode.render(SimpleNode.java:342)
> at org.apache.velocity.Template.merge(Template.java:356)
> at org.apache.velocity.Template.merge(Template.java:260)
> at org.apache.struts2.dispatcher.VelocityResult.doExecute(VelocityResult.java:156)
> at org.apache.struts2.dispatcher.StrutsResultSupport.execute(StrutsResultSupport.java:186)
> {code}



--
This message was sent by Atlassian Jira
(v8.20.10#820010)