Как избавиться от <mvc: annotation-driven/">?
До сих пор <mvc:annotation-driven />
вызвало много неприятностей для меня, поэтому я хотел бы избавиться от него. Хотя spring framework docs ясно говорят, что он должен делать, отсутствует список тегов, на самом деле итоговый <mvc:annotation-driven />
.
Итак, я застреваю с удалением <mvc:annotation-driven />
и теперь получаю ошибку
WARN o.s.web.servlet.PageNotFound - Не найдено сопоставление для HTTP-запроса с URI [/webapp/стажеров] в ДиспетчерСервель с именем 'Workoutsensor'
для всех Urls, которые должны быть разрешены классами контроллера (в данном случае: ./trainees
). Любое предложение, где я могу больше узнать о <mvc:annotation-driven />
? Я отчаянно хотел бы знать, какие теги точно представлены <mvc:annotation-driven />
.
Ответы
Ответ 1
Вы можете использовать BeanPostProcessor
для настройки каждого bean, определенного <mvc:annotation-driven />
. Javadocs теперь детализирует все beans регистры тегов.
Если вы действительно хотите избавиться от него, вы можете посмотреть исходный код org.springframework.web.servlet.config.AnnotationDrivenBeanDefinitionParser
И вы можете видеть, какой beans он определяет. Я сделал это упражнение (не для всех, но для тех, кто мне нужен), вот они:
<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
. Вы должны создать этот класс, чтобы использовать преобразование и проверку:
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);
}
}
И это работает для меня до сих пор. Не стесняйтесь сообщать о каких-либо проблемах.
Ответ 2
Если вы хотите избежать тега mvc:annotation-driven
, вы можете просто создать DefaultAnnotationHandlerMapping
и AnnotationMethodHandlerAdapter
beans самостоятельно, но похоже, что было бы лучше подойти к корню ваших проблем с самим тегом.
Каковы симптомы вашей проблемы? Что вы пытаетесь сделать с вашим приложением Spring MVC?
Если вы хотите знать, что происходит под обложками, когда вы используете mvc: annotation-driven, см. AnnotationDrivenBeanDefinitionParser
.parse()
.
Ответ 3
Старый вопрос, который я знаю, но это может помочь кому-то. Благодаря сообщениям на этой странице, а также здесь, я использовал следующее, чтобы заменить тег, основанный на аннотациях, в приложении Roo 1.2. Для них мне понадобилось преобразование типа поддержки в виде списка приложений в роу.
<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>
Ответ 4
В то время как переопределить, нужно подумать о том, чтобы переопределить обычное управление выполнением. В противном случае все ваши пользовательские сопоставления исключений не удастся. Вам придется повторно использовать 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>