Skip to content

Commit ed5e8ce

Browse files
committed
Ignore (invalid) default binding expressions
In data binding, expressions that don't match the structure of the target object are ignored. This is a follow-up on the previous commit that introduced checks on default data binding expressions to also ignore expressions that aren't property paths on the model rather than flagging them. Issue: SWF-1711
1 parent 4304449 commit ed5e8ce

File tree

1 file changed

+15
-26
lines changed

1 file changed

+15
-26
lines changed

spring-webflow/src/main/java/org/springframework/webflow/mvc/view/AbstractMvcView.java

Lines changed: 15 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,6 @@
2323
import java.util.List;
2424
import java.util.Map;
2525
import java.util.Set;
26-
2726
import javax.lang.model.SourceVersion;
2827

2928
import org.apache.commons.logging.Log;
@@ -514,30 +513,22 @@ protected void addEmptyValueMapping(DefaultMapper mapper, String field, Object m
514513
protected void addDefaultMapping(DefaultMapper mapper, String parameter, Object model) {
515514
Expression source = new RequestParameterExpression(parameter);
516515
ParserContext parserContext = new FluentParserContext().evaluate(model.getClass());
517-
validateDataBindingExpression(parameter, model);
518-
Expression target = expressionParser.parseExpression(parameter, parserContext);
519-
DefaultMapping mapping = new DefaultMapping(source, target);
520-
if (logger.isDebugEnabled()) {
521-
logger.debug("Adding default mapping for parameter '" + parameter + "'");
516+
if (expressionParser instanceof BeanWrapperExpressionParser || checkModelProperty(parameter, model)) {
517+
Expression target = expressionParser.parseExpression(parameter, parserContext);
518+
DefaultMapping mapping = new DefaultMapping(source, target);
519+
if (logger.isDebugEnabled()) {
520+
logger.debug("Adding default mapping for parameter '" + parameter + "'");
521+
}
522+
mapper.addMapping(mapping);
522523
}
523-
mapper.addMapping(mapping);
524524
}
525525

526526
/**
527-
* Check that the expression is a property path where each nested property
528-
* is a {@link SourceVersion#isName(CharSequence) valid Java identifier} and
529-
* that the first nested property name at least is a valid readable property
530-
* on the target object.
527+
* Perform basic checks on the given expression to see if it looks like a property path.
528+
* Check if the top nested property is a readable property on the Model.
529+
* Check if the remaining nested properties are valid Java identifiers.
531530
*/
532-
private void validateDataBindingExpression(String expression, Object model) {
533-
534-
if (expressionParser instanceof BeanWrapperExpressionParser) {
535-
return;
536-
}
537-
538-
String errorMessage = "Invalid data binding expression: '" + expression + "' " +
539-
"for target model class '" + model.getClass() + "'";
540-
531+
private boolean checkModelProperty(String expression, Object model) {
541532
List<String> propertyNames = new ArrayList<String>();
542533
while (true) {
543534
int index = PropertyAccessorUtils.getFirstNestedPropertySeparatorIndex(expression);
@@ -548,22 +539,20 @@ private void validateDataBindingExpression(String expression, Object model) {
548539
break;
549540
}
550541
if (expression.length() == index + 1) {
551-
throw new IllegalStateException(errorMessage);
542+
return false;
552543
}
553544
expression = expression.substring(index + 1);
554545
}
555-
556546
BeanWrapperImpl beanWrapper = new BeanWrapperImpl(model);
557547
if (!beanWrapper.isReadableProperty(propertyNames.get(0))) {
558-
throw new IllegalStateException(errorMessage);
548+
return false;
559549
}
560-
561550
for (int i=0; i < propertyNames.size(); i++) {
562551
if (!SourceVersion.isName(propertyNames.get(i))) {
563-
throw new IllegalStateException(errorMessage);
552+
return false;
564553
}
565554
}
566-
555+
return true;
567556
}
568557

569558
// package private

0 commit comments

Comments
 (0)