Walid Ghafir created WW-4036:
--------------------------------
Summary: With javatemplate, dynamic attribute value evaluates to
expression text if null
Key: WW-4036
URL: https://issues.apache.org/jira/browse/WW-4036
Project: Struts 2
Issue Type: Bug
Components: Plugin - Java Templates
Affects Versions: 2.3.12
Reporter: Walid Ghafir
When using javatemplate plugin, if an attribute has an expression value that
evaluates to null, the full expression text is displayed instead of just an
empty string.
Example:
<s:textfield placeholder="%{null}" name="%{null}"/>
will output
<input type="text" placeholder="%{null}" name=""/>
in the HTML.
By debugging, I found it comes from AbstractUITag.setDynamicAttribute():
dynamicAttributes.put(localName,
String.valueOf(ObjectUtils.defaultIfNull(findValue(value.toString()), value)));
That problem does not occur with FTL themes as dynamic-attributes.flt uses
TextParseUtil.translateVariables() which does what the doc says ("If an item
cannot be found on the stack (null is returned), then the entire variable
${...} is not displayed, just as if the item was on the stack but returned an
empty string.").
Suggested fix #1
Change org.apache.struts2.views.java.simple.DynamicAttributesHandler.start() so
that it does the same than dynamic-attributes.flt:
@Override
public void start(String name, Attributes a) throws IOException {
Map<String, String> dynamicAttributes = (Map<String, String>)
context.getParameters().get("dynamicAttributes");
for (String key : dynamicAttributes.keySet())
a.put(key,
TextParseUtil.translateVariables(dynamicAttributes.get(key),
context.getStack()));
super.start(name, a);
}
Suggested fix #2
Change org.apache.struts2.views.jsp.ui.setDynamicAttribute() so that it returns
an empty string if the expression evaluates to null:
public void setDynamicAttribute(String uri, String localName, Object value)
throws JspException {
if (ComponentUtils.altSyntax(getStack()) &&
ComponentUtils.isExpression(value)) {
dynamicAttributes.put(localName,
String.valueOf(ObjectUtils.defaultIfNull(findValue(value.toString()), "")));
} else {
dynamicAttributes.put(localName, value);
}
}
(but I no idea on the possible side effects it could produce).
--
This message is automatically generated by JIRA.
If you think it was sent incorrectly, please contact your JIRA administrators
For more information on JIRA, see: http://www.atlassian.com/software/jira