Spring Boot Catchall View控制器

时间:2017-05-01 20:05:46

标签: spring spring-mvc spring-boot

我试图设置一个Spring Boot,以便:

  • / resources / ** / *转到classpath:/ resources / ** / *
  • 正确处理任何控制器
  • 其他任何内容都会在不更改URL的情况下呈现index.ftl(以支持Javascript URL路由)

我已经足够轻松地完成了前两个工作,我可以得到" /"使用addViewControllers轻松地路由到index.ftl,但是当我为/**添加一个View Controller时,它会破坏我之前工作的资源处理程序。

我尝试过使用ViewControllerRegistry.setOrder()ResourceHandlerRegistry.setOrder()并且只是拒绝合作。

正确的方法是什么?

编辑:Spring Boot配置:

该项目使用Kotlin编写,并使用Maven和spring-boot-maven-plugin构建。我大部分时间都使用XML配置文件而不是Java,但我确实有一个Java配置类。

主要应用程序如下:

/**
 * The main entry point to the application
 */
@EnableAutoConfiguration
@Configuration
@EnableAdminServer
@ImportResource(
        "classpath:/spring/context.xml"
)
open internal class Application

/**
 * Run the application
 * @param args The command line arguments
 */
fun main(args: Array<String>) {
    SpringApplication.run(Application::class.java, *args)
}

/spring/context.xml看起来像:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:mvc="http://www.springframework.org/schema/mvc"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd">

    <bean id="clock" class="java.time.Clock" factory-method="systemUTC" />
    <bean id="restTemplate" class="org.springframework.web.client.RestTemplate" />

    <import resource="users.xml" />
    <import resource="authorization.xml" />
    <import resource="authentication-google.xml" />

    <bean class="uk.co.grahamcox.spring.MvcConfiguration">
    </bean>
</beans>

MvcConfiguration看起来像:

/**
 * Spring MVC Configuration
 */
@Configuration
open class MvcConfiguration() : WebMvcConfigurerAdapter() {

    /**
     * Add support for serving up static resources
     */
    override fun addResourceHandlers(registry: ResourceHandlerRegistry) {
        registry.addResourceHandler("/resources/**")
                .addResourceLocations("classpath:/resources/")
                .setCacheControl(CacheControl.noStore())
    }

    /**
     * {@inheritDoc}
     *
     * This implementation is empty.
     */
    override fun addViewControllers(registry: ViewControllerRegistry) {
        registry.addViewController("/")
                .setViewName("index")
    }
}

根据addViewControllersregistry.setOrder()addViewControllers次调用的存在和值,向addResourceHandlers添加此内容将会执行任何操作,否则会破坏资源处理程序:

    registry.addViewController("/**")
            .setViewName("index")

0 个答案:

没有答案