Spring MVC Truncating Path Variable IP Address
Ran into an interesting Spring MVC convulsion. If you use a path variable with a “.” in it, then the variable is truncated before it gets into your code via your controller.
For instance, say you make a request like:
/myapp/machine/12.4.55.137
And your spring controller handles it with this:
@RequestMapping(method = RequestMethod.GET, value = “/path/{ipAddress}”)
public @ResponseBody SomeResponseObject handlerMethod (@PathVariable String ipAddress) {…}
The variable ipAddress arrives in as 12.4.55, not 12.4.55.137 — it’s been truncated by Spring.
I’ve read through a lot of explanations, and it seems Spring considers the last part of a string with a “.” to be a file extension, and truncates it — useful for .json and .xml files. Understandable.
Spring now has annotation settings to turn the behavior off in the configuration (as of this date, Spring version 4.0.6 is out). I think some better solutions are:
- Using a Regular Expression filter in the @RequestMapping i.e. @RequestMapping(method = RequestMethod.GET, value = “/path/{ipAddress:.*}”)
- Using a request Param instead so the url is /myapp/machine?ipAddress=12.4.55.137
- Using the HttpServletresponse or WebResponse as a parameter in the method.
My favorite is the Regular Expression solution.
I’ve coded up samples in a simple Spring MVC app that runs in Maven/Java 6 or 7; the project is called “springrestparam” located here:
https://bitbucket.org/bilmowry/10kdev/src
java, mvc, spring