无法理解 @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
等)。
我一直在为 <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
等)。