Spring RequestMapping with root path(/ {custom})

时间:2016-06-18 22:28:07

标签: spring spring-mvc spring-boot

假设我的网站名称是: foo.com

当用户输入 foo.com 时,我想显示 index.html

当用户键入 foo.com/something 时,我希望服务器在控制器上捕获请求。

这是我在HomeController中所做的:

@Controller
public class HomeController {
    @RequestMapping(value={"/"}, method=RequestMethod.GET)
    public String getHome() {
        return "index.html";
    }
}

并且,CustomController应该捕获请求

@Controller
public class CustomController {
    @RequestMapping(value={"/{custom}"}, method=RequestMethod.GET)
    public String getCustom(@PathVariable String custom) {
        // Do something here..
    }
}

然而,它会抛出一个错误:循环视图路径[index.html]:将再次发送回当前处理程序URL [/index.html]。这是因为CustomController捕获了GET请求HomeController返回字符串后的 foo.com/index.html :index.html。

我做了这样的研究:

public class WebMvcConfiguration extends WebMvcConfigurerAdapter {
    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        registry.setOrder(Ordered.HIGHEST_PRECEDENCE);
        registry.addResourceHandler("/assets/**").addResourceLocations("classpath:/assets"); // My asset
        registry.addResourceHandler("index.html").addResourceLocations("file:/index.html");
    } // It's not working

    @Override
    public void addViewControllers(ViewControllerRegistry registry) {
        registry.addViewController("/").setViewName("forward:/" + FileNames.INDEX);
    } // This also not working
} 

在CustomController中将注释从@Controller更改为@RestController不是一个选项。

另外,我在项目中没有JSP文件 - 它们是普通的* .html文件。

My project setup

我正在使用Spring 1.3.3版本,所以请帮帮我。

1 个答案:

答案 0 :(得分:1)

此解决方案适用于 ui-router (AngularJS库)。此外,您必须更改 $ resourceProvider 设置:

// In your app module config
$resourceProvider.defaults.stripTrailingSlashes = false;

然后,在Spring服务器代码中,您可以这样做:

@RequestMapping(value = "/{custom:[^\\.]*}")
public String redirect(@PathVariable String custom) {
  // Do something here...
  return "forward:/";
}

在此链接找到解决方案:https://spring.io/blog/2015/05/13/modularizing-the-client-angular-js-and-spring-security-part-vii