无法理解:@EnableWebMvc和<annotation-driven> </annotation-driven>之间的行为差​​异

时间:2015-01-26 12:49:09

标签: java spring spring-annotations

我一直在为<interceptors>寻找基于注释的方法,然后找到here的方式

所以我用它和它的工作,但有一个问题。

当我这样做时;

@Configuration
@EnableWebMvc
public class WebApplicationConfig extends WebMvcConfigurerAdapter{
     ....
}

并且servlet-context.xml中没有<annotation-driven />标记然后它完全正常并且url被截获并且corressponding pre-post逻辑工作在“WebApplicationConfig” - 我的自定义拦截器中实现。

但是,如果我删除@EnableWebMvc并添加<annotation-driven />,那么从逻辑上说应用程序不起作用,这意味着没有截获任何网址,就像“WebApplicationConfig”类甚至不存在一样。

如果我同时保留@EnableWebMvc<annotation-driven />,那么

并关闭cource,然后在部署应用程序时出现异常。 :

    ERROR: org.springframework.web.servlet.DispatcherServlet - Context initialization failed
    ..........
    Caused by: org.springframework.beans.factory.BeanDefinitionStoreException: Factory method [public org.springframework.web.servlet.HandlerExceptionResolver 

org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport.handlerExceptionResolver()] threw exception;

 nested exception is java.lang.ClassCastException:

 org.springframework.web.accept.ContentNegotiationManagerFactoryBean$$EnhancerByCGLIB$$56a95502 cannot be cast to org.springframework.web.accept.ContentNegotiationManager

当我使用<annotation-driven />代替@EnableWebMvc

时,为什么网址没有被截获

如果我选择@EnableWebMvc而不是<annotation-driven />,那么在声明类WebApplicationConfig的地方使用@EnableWebMvc是对的吗?

2 个答案:

答案 0 :(得分:3)

虽然@EnableWebMvc<mvc:annotation-driven />具有相同的目的,但可以使用@Controller支持@RequestMapping。它们不是使用基于Java的配置或xml的补充,混合它们将不起作用。

WebMvcConfigurerAdapter或实际WebMvcConfigurer仅在使用@EnableWebMvc时设计和检测到,而不是在使用<mvc:annotation-driven />时。

尝试启用/使用它们时,您将遇到重复注册的comopnents(如RequestMappingHandlerAdapter等)的问题。

答案 1 :(得分:0)

@EnableWebMvc<mvc:annotation-driven/>与激活@controller等相同。

你确定在加载时加载了xml和config文件吗?

也许在您的xml文件中,控制器基础包的地址是错误的或类似的东西。尝试将控制器类添加为bean并查看它是否正常工作