2016-12-12 6 views
0

私はこれが私のスキーマパーサカスタムスプリングXMLスキーマパーサーでスプリングアノテーションBeanを設定する方法は?

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; 
    } 
} 

ですが、私はそれを実行したときに、スローこの

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

のような春のXMLスキーマを記述します。

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"); 
    } 
} 

しかし、XMLでdefaultBeforeHandlerを定義してもOKです。 xmlパーサーで@Componentアノテーションを使用するにはどうすればよいですか?

私はすでにapplicationContext.xml

春バージョンで<context:component-scan base-package="com.my.app" />をconfigコンいる:4.3

+0

私はあなたのユースケースを理解していないかもしれませんが、なぜ "カスタムXMLスキーマパーサー"を書くのでしょうか? Spring \ @Controllerを使用して、定義されたURLでリクエストに応答するWebアプリケーションを実際に作成することが目標である場合、\ @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

私はすでに ' '' applicationContext.xml'で – enyo

関連する問題