2016-07-05 2 views
0

Как я понимаю из docs<mvc:annotation-driven/> является просто ярлыком для регистрации RequestMappingHandlerMapping, RequestMappingHandlerAdapter, ExceptionHandlerExceptionResolver и некоторых других вещей.Как заменить <mvc: annotation-driven /> на пользовательские компоненты?

Мой вопрос: как я могу вручную определить ту же функциональность, что и предоставляет <mvc:annotation-driven/> без использования <mvc:annotation-driven/>?

I.e. Мне нужен пример конфигурации Spring, который определяет и настраивает все компоненты, неявно созданные с помощью ярлыка <mvc:annotation-driven/>. Другими словами, мне нужна скомпилированная версия <mvc:annotation-driven/> (со всеми значениями по умолчанию).

P.S. Мне это нужно, потому что <mvc:annotation-driven/> не так гибка и не предоставляет способы настройки неявно зарегистрированные бобов (Я хочу настроить alwaysUseFullPath свойства RequestMappingHandlerMapping)

+0

Это довольно легко сделать. Создайте bean-компонент, реализующий проверку BeanPostProcessor '' postProcessBeforeInitialization', если бит имеет нужный вам тип, установите дополнительные свойства. Это намного проще, чем пытаться настроить все, что делает пространство имен. –

ответ

0

Вы можете попробовать путем удаления <mvc:annotation-driven/> тега и определите весь боб явно с помощью <bean> тега и другой вспомогательный тег.

см Также в этом Howto get rid of <mvc:annotation-driven />?

+1

Ссылка на старую версию '' некоторые из упомянутых в ней классов устарели и уже удалены из предстоящей версии Spring 5. –

+0

@ M.Deinum yah ... Я поделился этим, потому что, хотя это может помочь OP. –

1

Вы можете это сделать даже без ручного конфигурирования. Просто настройте UrlPathHelper и настройте его на конфигурацию.

<bean id="urlPathHelper" class="org.springframework.web.util.UrlPathHelper"> 
    <property name="alwaysUseFullPath" value="true" /> 
<bean> 

<mvc:annotation-driven path-helper="urlPathHelper" /> 

Если это не работает, потому что вы находитесь на старой пружинной версии использовать BeanPostProcessor и в его postProcessBeforeInitialization сделать дополнительные настройки/инициализации вы хотите. Это было бы громоздким, чтобы сделать пытается воссоздать все варианты <mvc:annotation-driven />so, just to set a single property. Instead create a bean which implements BeanPostProcessor`

public class WebMvcConfigurer implements BeanPostProcessor { 

    public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException { 
     if (bean instanceof RequestMappingHandlerMapping) { 
      ((RequestMappingHandlerMapping) bean).setAlwaysUseFullPath(true); 
     } 
     return bean; 
    } 

    public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException { 
      return bean; 
    } 
} 

Просто добавьте этот компонент в вашей конфигурации XML и сделать.

Смежные вопросы