有没有办法在没有声明配置文件中的每个控制器的情况下使用Spring配置我的MVC?

时间:2015-09-17 06:46:37

标签: java spring spring-mvc

我正在尝试使用百万美元来制作一个mvc。

我遵循了这个教程,现在工作得很好https://spring.io/guides/gs/securing-web/但是当我想要映射/ admin / somepage时出现问题,由于某种原因没有找到(即使我在{{1方法

在示例中,他们创建了一个文件addViewController,有没有办法我避免使用这个文件,我有一个配置,允许我不必在这里添加所有控制器和视图,并从控制器自动解析文件由@RequestMapping?

编辑:这是代码

的src /主/资源/模板/ home.html的

src/main/java/hello/MvcConfig.java

的src /主/资源/模板/ hello.html的

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:th="http://www.thymeleaf.org" xmlns:sec="http://www.thymeleaf.org/thymeleaf-extras-springsecurity3">
    <head>
        <title>Spring Security Example</title>
    </head>
    <body>
        <h1>Welcome!</h1>

        <p>Click <a th:href="@{/hello}">here</a> to see a greeting.</p>
    </body>
</html>

这是我想要摆脱的部分......

的src /主/ JAVA /你好/ MvcConfig.java

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:th="http://www.thymeleaf.org"
      xmlns:sec="http://www.thymeleaf.org/thymeleaf-extras-springsecurity3">
    <head>
        <title>Hello World!</title>
    </head>
    <body>
        <h1>Hello world!</h1>
    </body>
</html>

在控制器上我有

的方法
package hello;

import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.ViewControllerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;

@Configuration
public class MvcConfig extends WebMvcConfigurerAdapter {

    @Override
    public void addViewControllers(ViewControllerRegistry registry) {
        registry.addViewController("/home").setViewName("home");
        registry.addViewController("/").setViewName("home");
        registry.addViewController("/hello").setViewName("hello");
        registry.addViewController("/login").setViewName("login");
    }

}

返回@RequestMapping("/home")..

1 个答案:

答案 0 :(得分:2)

您可以向RequestMappingHandlerMapping添加默认处理程序,添加的默认处理程序为Here is

如果您按照指南使用Spring Boot。您需要获取预配置的RequestMappingHandlerMapping并设置所需的属性。您可以使用BeanPostProcessor

public class YourBeanPostProcessor implements BeanPostProcessor {

    public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
        return bean;
    }

    public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
        if (bean instanceof RequestMappingHandlerMapping) {
              ((RequestMappingHandlerMapping) bean).setDefaultHandler(new UrlFilenameController());
        }
        return bean;
    }
}

这种方式匹配的网址将始终传递给UrlFilenameController以解析为视图名称。

注意:可能需要根据可用HandlerMapping的数量在不同的HandlerMapping上注册。现在总是返回UrlFilenameController,这可能会导致其他HandlerMapping不再被咨询。