如何摆脱<mvc:annotation-driven />?

到目前为止, <mvc:annotation-driven />对我造成了很大的麻烦,所以我想摆脱它。 虽然春季框架文档清楚地说明它应该做什么,但实际上标签列表<mvc:annotation-driven />缺乏。

所以我坚持删除<mvc:annotation-driven /> ,现在得到错误

WARN osweb.servlet.PageNotFound – 在名为“workoutsensor”的DispatcherServlet中找不到具有URI的HTTP请求的映射[/ webapp / trainees]

对于所有的Url应该由控制器类来解决(在这种情况下: ./trainees )。 任何build议,我可以阅读更多关于<mvc:annotation-driven /> ? 我非常想知道<mvc:annotation-driven />代表了什么标签。

您可以使用BeanPostProcessor来自定义由<mvc:annotation-driven />定义的每个bean。 javadoc现在详述了标签注册的所有bean。

如果你真的想摆脱它,你可以看看org.springframework.web.servlet.config.AnnotationDrivenBeanDefinitionParser的源代码

你可以看到它定义了哪些bean。 我做了这个“练习”(不是为了所有人,而是为了我所需要的),所以他们是:

 <bean id="validator" class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean" /> <bean id="conversionService" class="org.springframework.format.support.FormattingConversionServiceFactoryBean" /> <bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter"> <property name="webBindingInitializer"> <bean class="com.yourpackage.web.util.CommonWebBindingInitializer" /> </property> <property name="messageConverters"> <list> <bean class="org.springframework.http.converter.ByteArrayHttpMessageConverter" /> <bean class="org.springframework.http.converter.ResourceHttpMessageConverter" /> <bean class="org.springframework.http.converter.StringHttpMessageConverter" /> <bean class="org.springframework.http.converter.feed.AtomFeedHttpMessageConverter" /> <bean class="org.springframework.http.converter.feed.RssChannelHttpMessageConverter" /> <bean class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter" /> <bean class="org.springframework.http.converter.xml.SourceHttpMessageConverter" /> <bean class="org.springframework.http.converter.xml.XmlAwareFormHttpMessageConverter" /> <!-- bean class="org.springframework.http.converter.xml.Jaxb2RootElementHttpMessageConverter" /--> </list> </property> </bean> <bean id="handlerMapping" class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping"> 

现在,在上面看到CommonWebBindingInitializer 。 你必须创build这个类,以便使用转换和validation:

 public class CommonWebBindingInitializer implements WebBindingInitializer { @Autowired private Validator validator; @Autowired private ConversionService conversionService; @Override public void initBinder(WebDataBinder binder, WebRequest request) { binder.setValidator(validator); binder.setConversionService(conversionService); } } 

迄今为止,这对我来说工作得很好。 随意报告任何问题。

如果你想避免使用mvc:annotation-driven标签,你可以简单地自己创buildDefaultAnnotationHandlerMappingAnnotationMethodHandlerAdapter bean,但是听起来好像是用标签本身来find麻烦的根源。

你的问题有什么症状? 你想用你的Spring MVC应用程序做什么?

如果您想在使用mvc:annotation-driven时知道封面下面发生了什么,请参阅AnnotationDrivenBeanDefinitionParser .parse()方法。

老问题我知道,但这可能有助于某人。 感谢在这个页面上的post,也在这里 ,我已经使用以下内容来replaceRoo 1.2应用程序中的注释驱动标签。 他们踢我是在roo应用程序列表视图中需要支持types转换。

 <bean id="validator" class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean" /> <bean id="conversionService" class="org.springframework.format.support.FormattingConversionServiceFactoryBean" /> <bean id="conversionServiceExposingInterceptor" class="org.springframework.web.servlet.handler.ConversionServiceExposingInterceptor"> <constructor-arg ref="conversionService" /> </bean> <bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping"> <property name="order" value="0" /> <property name="interceptors"> <list> <ref bean="conversionServiceExposingInterceptor" /> </list> </property> </bean> <bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter"> <property name="webBindingInitializer"> <bean class="org.springframework.web.bind.support.ConfigurableWebBindingInitializer"> <property name="conversionService" ref="conversionService" /> <property name="validator" ref="validator" /> </bean> </property> <property name="messageConverters"> <list> <bean class="org.springframework.http.converter.ByteArrayHttpMessageConverter" /> <bean class="org.springframework.http.converter.StringHttpMessageConverter" /> <bean class="org.springframework.http.converter.FormHttpMessageConverter" /> <bean class="org.springframework.http.converter.xml.SourceHttpMessageConverter" /> </list> </property> </bean> 

在压倒一切时,也要考虑自定义执行pipe理覆盖。 否则,所有的自定义exception映射都将失败。 您将不得不重复使用messageCoverters与列表bean:

 <bean id="validator" class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean" /> <bean id="conversionService" class="org.springframework.format.support.FormattingConversionServiceFactoryBean" /> <util:list id="messageConverters"> <bean class="your.custom.message.converter.IfAny"></bean> <bean class="org.springframework.http.converter.ByteArrayHttpMessageConverter"></bean> <bean class="org.springframework.http.converter.StringHttpMessageConverter"></bean> <bean class="org.springframework.http.converter.ResourceHttpMessageConverter"></bean> <bean class="org.springframework.http.converter.xml.SourceHttpMessageConverter"></bean> <bean class="org.springframework.http.converter.xml.XmlAwareFormHttpMessageConverter"></bean> <bean class="org.springframework.http.converter.xml.Jaxb2RootElementHttpMessageConverter"></bean> <bean class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter"></bean> </util:list> <bean name="exceptionHandlerExceptionResolver" class="org.springframework.web.servlet.mvc.method.annotation.ExceptionHandlerExceptionResolver"> <property name="order" value="0"/> <property name="messageConverters" ref="messageConverters"/> </bean> <bean name="handlerAdapter" class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter"> <property name="webBindingInitializer"> <bean class="org.springframework.web.bind.support.ConfigurableWebBindingInitializer"> <property name="conversionService" ref="conversionService" /> <property name="validator" ref="validator" /> </bean> </property> <property name="messageConverters" ref="messageConverters"/> </bean> <bean id="handlerMapping" class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping"> </bean>