2323import java .util .List ;
2424import java .util .Map ;
2525import java .util .Set ;
26-
2726import javax .lang .model .SourceVersion ;
2827
2928import 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