私はこれが私のスキーマパーサカスタムスプリング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
私はあなたのユースケースを理解していないかもしれませんが、なぜ "カスタムXMLスキーマパーサー"を書くのでしょうか? Spring \ @Controllerを使用して、定義されたURLでリクエストに応答するWebアプリケーションを実際に作成することが目標である場合、\ @RequestMapping注釈は意味をなさないかもしれません。 DefaultBeforeHandlerは、Springインターセプタでもあります。もちろん、私は実際にあなたが何を構築しているのか分からない。 – turboemu
私たちは多くのシステムを持っていますが、この 'ルートXMLスキーマパーサー'は転送対象です.HTTPはその背後にある他のシステムに必要です。 – enyo