Problem

See following Spring REST example, if a request such as “http://localhost:8080/site/google.com” is submitted, Spring returns “google“. Look like Spring treats “.” as file extension, and extract half of the parameter value.

SiteController.java
package com.mkyong.web.controller;
 
import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
 
@Controller
@RequestMapping("/site")
public class SiteController {
 
	@RequestMapping(value = "/{domain}", method = RequestMethod.GET)
	public String printWelcome(@PathVariable("domain") String domain,
		ModelMap model) {
 
		model.addAttribute("domain", domain);
		return "domain";
 
	}
 
}

Solution

To fix it, make @RequestMapping supports regular expression, add “.+“, it means match anything. Now, Spring will return “google.com“.

SiteController.java
package com.mkyong.web.controller;
 
import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
 
@Controller
@RequestMapping("/site")
public class SiteController {
 
	@RequestMapping(value = "/{domain:.+}", method = RequestMethod.GET)
	public String printWelcome(@PathVariable("domain") String domain,
		ModelMap model) {
 
		model.addAttribute("domain", domain);
		return "domain";
 
	}
 
}

References

  1. Spring MVC – URI Template Patterns with Regular Expressions
  2. Regular Expression Wikipedia
  3. Spring jira – SPR-6164
Tags :
Founder of Mkyong.com, love Java and open source stuffs. Follow him on Twitter, or befriend him on Facebook or Google Plus.
Here are some of my recommended Books

Related Posts

Popular Posts