Как избавиться от <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>