I have a controller that provides RESTful access to information:
@RequestMapping(method = RequestMethod.GET, value = Routes.BLAH_GET + "/{blahName}")
public ModelAndView getBlah(@PathVariable String blahName, HttpServletRequest request,
HttpServletResponse response) {
The problem I am experiencing is that if I hit the server with a path variable with special characters it gets truncated. For example: http://localhost:8080/blah-server/blah/get/blah2010.08.19-02:25:47
The parameter blahName will be blah2010.08
However, the call to request.getRequestURI() contains all the information passed in.
Any idea how to prevent Spring from truncating the @PathVariable?
I also ran into the same issue, and setting the property to false didn't help me either. However, the API says:
I tried adding "/end" to my RESTful URL, and the problem went away. I'm not please with the solution, but it did work.
BTW, I don't know what the Spring designers were thinking when they added this "feature" and then turned it on by default. IMHO, it should be removed.
The file extension problem only exists if the parameter is in the last part of the URL. Change
to
and all will be well again-
Try a regular expression for the
@RequestMapping
argument:This is probably closely related to SPR-6164. Briefly, the framework tries to apply some smarts to the URI interpretation, removing what it thinks are file extensions. This would have the effect of turning
blah2010.08.19-02:25:47
intoblah2010.08
, since it thinks the.19-02:25:47
is a file extension.As described in the linked issue, you can disable this behaviour by declaring your own
DefaultAnnotationHandlerMapping
bean in the app context, and setting itsuseDefaultSuffixPattern
property tofalse
. This will override the default behaviour, and stop it molesting your data.Java based configuration solution to prevent truncation (using a not-deprecated class):
Source: http://www.javacodegeeks.com/2013/01/spring-mvc-customizing-requestmappinghandlermapping.html
UPDATE:
I realized having some problems with Spring Boot auto-configuration when I used the approach above (some auto-configuration doesn't get effective).
Instead, I started to use the
BeanPostProcessor
approach. It seemed to be working better.Inspired from: http://ronaldxq.blogspot.com/2014/10/spring-mvc-setting-alwaysusefullpath-on.html
Everything after the last dot is interpreted as file extension and cut off by default.
In your spring config xml you can add
DefaultAnnotationHandlerMapping
and setuseDefaultSuffixPattern
tofalse
(default istrue
).So open your spring xml
mvc-config.xml
(or however it is called) and addNow your
@PathVariable
blahName
(and all other, too) should contain the full name including all dots.EDIT: Here is a link to the spring api