2016-12-12 9 views
0

я пишу весной XML-схемы, как этотКак установить весной аннотации bean в пользовательских весной XML-анализатор?

<route:urls id="urlHandlerMap"> 
    <route:url pattern="user/api/**" beforeHandlers="defaultBeforeHandler"/> 
</route:urls> 

это моя схема анализатор

public class ApiRouteParser extends AbstractSingleBeanDefinitionParser { 
    private static String DEFAULT_BEFORE_HANDLER = "defaultBeforeHandler"; 

    private static String ROUTE_URL_FIELD = "route:url"; 
    private static String PATTERN_FIELD = "pattern"; 
    private static String BEFORE_HANDLER_FIELD = "beforeHandlers"; 

    @Override 
    protected Class getBeanClass(Element element) { 
     return UrlHandlerMap.class; 
    } 

    @Override 
    protected void doParse(Element element,ParserContext parserContext, BeanDefinitionBuilder builder) { 
     NodeList urlList = element.getElementsByTagName(ROUTE_URL_FIELD); 
     ManagedMap<String, BeanMetadataElement> urlHandlerMapperDefinition = new ManagedMap<String, BeanMetadataElement>(); 
     for (int i=0; i < urlList.getLength(); i++){ 
      Element urlNode = (Element)urlList.item(i); 

      String pattern = urlNode.getAttribute(PATTERN_FIELD); 
      String beforeHandlers = urlNode.getAttribute(BEFORE_HANDLER_FIELD); 

      if (StringUtils.isEmpty(beforeHandlers)){ 
       beforeHandlers = DEFAULT_BEFORE_HANDLER; 
      } 


      BeanDefinitionBuilder urlHandlerBuilder = BeanDefinitionBuilder.genericBeanDefinition(UrlHandler.class); 

      urlHandlerBuilder.addPropertyValue("beforeHandlerList", parseList(beforeHandlers)); 
      urlHandlerMapperDefinition.put(pattern, urlHandlerBuilder.getBeanDefinition()); 
     } 
     builder.addPropertyValue("urlHandlerMapper", urlHandlerMapperDefinition); 
    } 

    private List<BeanMetadataElement> parseList(String handlers){ 
     List<BeanMetadataElement> definitionList = new ManagedList<BeanMetadataElement>(); 
     String[] handlerArray = handlers.split(","); 
     for (String handler : handlerArray){ 
      // this handler is inject with @Component 
      definitionList.add(new RuntimeBeanReference(handler)); 
     } 
     return definitionList; 
    } 
} 

, но когда я запускаю его, бросает:

Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named 'defaultBeforeHandler' available 
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBeanDefinition(DefaultListableBeanFactory.java:680) 
    at org.springframework.beans.factory.support.AbstractBeanFactory.getMergedLocalBeanDefinition(AbstractBeanFactory.java:1183) 
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:284) 
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:202) 
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:275) 
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:197) 
    at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveReference(BeanDefinitionValueResolver.java:351) 

это defaultBeforeHandler

@Component 
public class DefaultBeforeHandler extends BaseController implements BeforeHandler { 
    private static Logger logger = LoggerFactory.getLogger(DefaultBeforeHandler.class); 
    @Override 
    public void execute(RouteRequest routeRequest, HttpServletRequest request) throws Exception{ 
     logger.debug("defaultBeforeHandler"); 
    } 
} 

, но когда я определяю defaultBeforeHandler в xml, это будет нормально. Как я могу использовать аннотацию @Component в моем XML-синтаксисе?

Я уже конфиг <context:component-scan base-package="com.my.app" /> в applicationContext.xml

пружинной версии: 4,3

+0

Возможно, я не понимаю ваш прецедент, но зачем писать «пользовательский синтаксический анализатор XML-схем»? Если ваша цель - создать веб-приложение для ответа на запросы по определенному URL-адресу, использование справки Springs \ @Controller, \ @RequestMapping может иметь больше смысла. DefaultBeforeHandler также может быть перехватчиком Spring. Конечно, я не уверен, что вы строите. – turboemu

+0

У нас много систем, этот «парсер XML-схемы» является предметом передачи, передача http требуется другим системам за ним – enyo

ответ

0

Вам необходимо включить сканирование компонента через конфигурацию. Либо аннотация, либо XML. Например.

@Configuration 
@ComponentScan("com.acme.app.services") 
public class AppConfig { 
// various @Bean definitions ... } 

Этот пример позволит конфигурацию аннотаций и сканировать пакеты под com.acme.app.services для любых аннотированных классов и зарегистрировать их как бобы. Обновите эту строку, чтобы соответствовать пакету с вашим аннотированным классом.

См. docs для более подробной информации.

+0

У меня уже есть конфиг '<контекст: base-package компонента-comp =" com.my.app "/ > 'в' applicationContext.xml' – enyo

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

  • Нет связанных вопросов^_^