Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在自定义标记内解析spring导入语句_Java_Xml_Spring_Spring Bean - Fatal编程技术网

Java 在自定义标记内解析spring导入语句

Java 在自定义标记内解析spring导入语句,java,xml,spring,spring-bean,Java,Xml,Spring,Spring Bean,我有一个Java应用程序,它解析以下格式的xml文件 <x:foo xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:x="http://www.hello.org/x/foo" xsi:schemaLocation="http://www.hello.org/x/foo h

我有一个Java应用程序,它解析以下格式的xml文件

<x:foo xmlns="http://www.springframework.org/schema/beans"
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:x="http://www.hello.org/x/foo"
           xsi:schemaLocation="http://www.hello.org/x/foo http://schemas.hello.org/x/foo-1.0.0.xsd
           http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.1.xsd">

    <x:myBeans>
        <bean id="my-bean-1" class="org.hello.sample.SampleClass1">
            <!-- some properties goes here -->
        </bean>
        <bean id="my-bean-2" class="org.hello.sample.SampleClass2">
            <!-- some properties goes here -->
        </bean>

        <import resource="sub-file.xml"/>
    </x:myBeans>

    <x:otherElements>
        <!-- Some non-spring xml elements (which are not used by application logic) goes here -->
    </x:otherElements>
</x:flow>

myBeans标记包含一组原生springbean和import语句。otherElements标记包含一组元素,这些元素仅由生成此文件的单独应用程序使用。我的应用程序只对那些spring Bean和进口产品感兴趣

因此,我使用下面的自定义bean解析器来解析这个文件,并将springbean定义添加到spring上下文中

public class MyBeanDefinitionParser extends AbstractSingleBeanDefinitionParser {

    @Override
    protected void doParse(Element element, ParserContext parserContext, BeanDefinitionBuilder builder) {
        Element myBeansElement = DomUtils.getChildElementByTagName(element, "myBeans");
        if (myBeansElement != null) {

            // Parsing 'bean' elements
            List<Element> beanElements = DomUtils.getChildElementsByTagName(myBeansElement, "bean");
            for (Element beanElement : beanElements) {
                BeanDefinitionHolder bdh = parserContext.getDelegate().parseBeanDefinitionElement(beanElement);
                parserContext.getRegistry().registerBeanDefinition(bdh.getBeanName(), bdh.getBeanDefinition());
            }

            // Parsing 'import' statements
            List<Element> importElements = DomUtils.getChildElementsByTagName(myBeansElement, "import");
            for (Element importElement : importElements) {
                // TODO   
            }
        }
    }
}
公共类MyBeanDefinitionParser扩展了AbstractSingleBeanDefinitionParser{
@凌驾
受保护的void doParse(元素元素、ParserContext、ParserContext、BeanDefinitionBuilder){
元素myBeansElement=DomUtils.getChildElementByTagName(元素,“myBeans”);
if(myBeansElement!=null){
//解析“bean”元素
List beanElements=DomUtils.getChildElementsByTagName(MyBeanElement,“bean”);
for(元素beanElement:beanElements){
BeanDefinitionHolder bdh=parserContext.getDelegate().parseBeanDefinitionElement(BeaneElement);
parserContext.getRegistry().registerBeanDefinition(bdh.getBeanName(),bdh.getBeanDefinition());
}
//解析“import”语句
List importElements=DomUtils.getChildElementsByTagName(myBeansElement,“导入”);
对于(元素重要性:重要性){
//待办事项
}
}
}
}
解析和向上下文中添加Springbean(my-bean-1、my-bean-2)工作正常。
但是,我如何解析文件sub file.xml(具有相同结构)中定义的bean并将其添加到spring上下文中呢?

我能够按如下方式实现上述功能

// Parsing 'import' statements
List<Element> importElements = DomUtils.getChildElementsByTagName(myBeansElement, "import");
Resource currentResource = parserContext.getReaderContext().getResource();
for (Element importElement : importElements) {
    String importPath = importElement.getAttribute("resource");
    try {
        Resource importResource = currentResource.createRelative(importPath);
        parserContext.getReaderContext().getReader().loadBeanDefinitions(importResource);
    } catch (IOException | BeanDefinitionStoreException e) {
        e.printStackTrace();
    } 
}
//解析“import”语句
List importElements=DomUtils.getChildElementsByTagName(myBeansElement,“导入”);
Resource currentResource=parserContext.getReaderContext().getResource();
对于(元素重要性:重要性){
字符串importPath=importElement.getAttribute(“资源”);
试一试{
Resource importResource=currentResource.createRelative(导入路径);
parserContext.getReaderContext().getReader().loadBeanDefinitions(导入源);
}捕获(IOException | BeanDefinitionStoreException e){
e、 printStackTrace();
} 
}
我还必须在bean元素之前解析import语句,这样bean引用就不会被破坏