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

Can not understand difference in behavior between : @EnableWebMvc and <annotation-driven />

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

所以我使用了它并且它起作用了,但是有一个问题。

当我做的时候;

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

并且在 servlet-context.xml 中没有 <annotation-driven /> 标签,那么它工作得很好并且 url 被拦截并且相应的 pre-post 逻辑按照在"WebApplicationConfig " - 我的自定义拦截器。

但是,如果我删除 @EnableWebMvc 并添加 <annotation-driven />,那么从逻辑上讲,应用程序将无法运行,这意味着没有 url 被拦截,就像 "WebApplicationConfig " class 甚至不存在。

如果我同时保留 @EnableWebMvc<annotation-driven />,那么我在部署应用程序时会遇到异常。 :

    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$a95502 cannot be cast to org.springframework.web.accept.ContentNegotiationManager

所以为什么 url 没有被拦截,当我使用 <annotation-driven /> 而不是 @EnableWebMvc

此外,如果我使用 @EnableWebMvc 而没有使用 <annotation-driven />,那么在声明 class WebApplicationConfig 的地方使用 @EnableWebMvc 是正确的地方吗?

@EnableWebMvc<mvc:annotation-driven/>激活@controller等是一样的。

您确定 xml 和配置文件都在加载时加载了吗?

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

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

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

当尝试 enable/use 它们时,您将 运行 遇到注册重复组件的问题(例如 RequestMappingHandlerAdapter 等)。