Web Development

Fixing the Spring Web error: Expected lookupPath in request attribute “org.springframework.web.util.UrlPathHelper.PATH”

The other day I was upgrading my Spring Boot app from 2.3.1 to 2.6.6 to address the recent Spring vulnerability. This upgraded the dependent Spring libraries from 5.2.7 to 5.3.18.

At start-up my application dynamically adds some REST endpoints by adding new RequestMappingInfo objects to the RequestMappingHandlerMapping bean already registered in the application context:

ApplicationContext ctx = event.getApplicationContext();

RequestMappingHandlerMapping requestMappingHandlerMapping = ctx.getBean(RequestMappingHandlerMapping.class);

String key = "/v5/person/{id}"
RequestMethod requestMethod = RequestMethod.GET
RequestMappingInfo requestMappingInfo =
                    RequestMappingInfo.paths(key)
                            .methods(requestMethod)
                            .build();

Method method = DynamicPersonController.class.getMethod("handle", HttpHeaders.class, HttpServletRequest.class);
            requestMappingHandlerMapping.registerMapping(requestMappingInfo, handler, method);

When invoking my /v5/person/{id} REST endpoint after the upgrade, this error would be in the console:

Request processing failed; nested exception is java.lang.IllegalArgumentException: Expected lookupPath in request attribute "org.springframework.web.util.UrlPathHelper.PATH"

This problem was caused by changes Spring made to path pattern matching. Spring now wants RequestMappingInfo to use PathPatternsRequestCondition. Previously it used PatternsRequestCondition.

You can opt out of this change after upgrading by setting this property:

spring.mvc.pathmatch.matching-strategy=ANT_PATH_MATCHER

But to use the new preferred PathPatternsRequestCondition and not have to add the property above, I needed to change the configuration of the Builder used to create the RequestMappingInfo.

RequestMappingInfo.BuilderConfiguration options = new RequestMappingInfo.BuilderConfiguration();
options.setPatternParser(new PathPatternParser());

String key = "/v5/person/{id}"
RequestMethod requestMethod = RequestMethod.GET
RequestMappingInfo requestMappingInfo =
                    RequestMappingInfo.paths(key)
                            .methods(requestMethod)
                            .options(options)  //This is Builder config
                            .build();

After adding the RequestMappingInfo.BuilderConfiguration, all my dynamic endpoints started working again.

Published on Java Code Geeks with permission by Steven Wall, partner at our JCG program. See the original article here: Fixing the Spring Web error: Expected lookupPath in request attribute “org.springframework.web.util.UrlPathHelper.PATH”

Opinions expressed by Java Code Geeks contributors are their own.

Want to know how to develop your skillset to become a Java Rockstar?

Join our newsletter to start rocking!

To get you started we give you our best selling eBooks for FREE!

 

1. JPA Mini Book

2. JVM Troubleshooting Guide

3. JUnit Tutorial for Unit Testing

4. Java Annotations Tutorial

5. Java Interview Questions

6. Spring Interview Questions

7. Android UI Design

 

and many more ....

 

Receive Java & Developer job alerts in your Area

I have read and agree to the terms & conditions

 

Subscribe
Notify of
guest

This site uses Akismet to reduce spam. Learn how your comment data is processed.

0 Comments
Inline Feedbacks
View all comments
Back to top button