【问题标题】:Equivalent of mvc:default-servlet-handler in Spring annotation-based configuration?Spring基于注释的配置中的mvc:default-servlet-handler的等价物?
【发布时间】:2011-11-15 23:46:48
【问题描述】:

是否可以在AnnotationConfig(Web)ApplicationContext 中定义等效的<mvc:default-servlet-handler/>?现在我有:

@Configuration
@ImportResource("classpath:/mvc-resources.xml")
class AppConfig {
  // Other configuration...
}

在我的resources/mvc-resources.xml 中只有以下内容:

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

它按预期工作。是否可以在不导入 XML 文件的情况下执行此操作?这将是减少一些样板文件的好方法。

【问题讨论】:

    标签: java spring spring-mvc


    【解决方案1】:

    如果您使用带有 WebMvc 的 Spring 3.1,您可以像这样配置默认 servlet 处理:

    @Configuration
    @EnableWebMvc
    public class MvcConfig extends WebMvcConfigurerAdapter {
    
        @Override
        public void configureDefaultServletHandling(
                DefaultServletHandlerConfigurer configurer) {
            configurer.enable();
        }
    }
    

    【讨论】:

      【解决方案2】:

      深入挖掘后,我发现这是一个已知问题,并通过即将发布的Spring 3.1 中的注释功能解决。

      我用以下代码解决了我的问题:

      @Configuration
      @Import(FeatureConfig.class)
      class AppConfig {
         ...
      }
      
      @FeatureConfiguration
      class FeatureConfig {
        @Feature
        public MvcDefaultServletHandler defaultHandler() {
          return new MvcDefaultServletHandler();
        }
      }
      

      虽然这确实需要使用里程碑版本的 spring,但它似乎是处理这个问题的最干净和首选的方式。

      【讨论】:

      • 请注意,从 M2 开始,他们已经放弃了 @Feature 以支持单独的 @Enable* 注释。
      【解决方案3】:

      我认为你不能开箱即用,但你可以复制 what DefaultServletHandlerBeanDefinitionParser does:创建一个 DefaultServletHttpRequestHandler 类型的 Bean 并将其映射到 URL 方案 /**

      我会说你的 Bean 应该继承 DefaultServletHttpRequestHandler 并映射 in a @PostConstruct method

      【讨论】:

        【解决方案4】:
        @Bean
        public DefaultServletHttpRequestHandler defaultServletHttpRequestHandler() {
          return new DefaultServletHttpRequestHandler();
        }
        
        @Bean
        public SimpleUrlHandlerMapping simpleUrlHandlerMapping() {
          Map<String, String> urlMap = new ManagedMap<String, String>();
          urlMap.put("/**", defaultServletHandlerName);
        
          SimpleUrlHandlerMapping hm = new SimpleUrlHandlerMapping();
          hm.setUrlMap(urlMap);
          return hm;
        }
        

        【讨论】:

        • 我从哪里获得defaultServletHandlerName
        • 另外,DefaultServletHttpRequestHandler 似乎优先于我的处理程序,因此可以提供静态文件,但我自己定义的路径不行。
        猜你喜欢
        • 1970-01-01
        • 2015-12-06
        • 2012-01-15
        • 2015-07-11
        • 1970-01-01
        • 2023-01-17
        • 1970-01-01
        • 2016-12-27
        • 2011-06-05
        相关资源
        最近更新 更多