я пишу весной 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
Возможно, я не понимаю ваш прецедент, но зачем писать «пользовательский синтаксический анализатор XML-схем»? Если ваша цель - создать веб-приложение для ответа на запросы по определенному URL-адресу, использование справки Springs \ @Controller, \ @RequestMapping может иметь больше смысла. DefaultBeforeHandler также может быть перехватчиком Spring. Конечно, я не уверен, что вы строите. – turboemu
У нас много систем, этот «парсер XML-схемы» является предметом передачи, передача http требуется другим системам за ним – enyo