Flink一个解析xml

基于SpringBoot框架下的Flink程序出现异常。Cannot find the declaration of element 'beans'.

目前写了一个Flink程序,是基于SpringBoot项目,一个父项目下有两个子Module,在本地IDEA跑通的情况下,提交到集群上就出现了如下的异常。就是一个SpringBoot的一个入口ykt-dp.xml文件解析错误抛出的异常。此方法是沿用之前的架构,修改一下必要的参数。本地可以跑通,该异常是在集群上出现的。

异常详情

img


------------------------------------------------------------
 The program finished with the following exception:

org.apache.flink.client.program.ProgramInvocationException: The main method caused an error: Line 8 in XML document from class path resource [ykt-dp.xml] is invalid; nested exception is org.xml.sax.SAXParseException; lineNumber: 8; columnNumber: 104; cvc-elt.1: Cannot find the declaration of element 'beans'.
        at org.apache.flink.client.program.PackagedProgram.callMainMethod(PackagedProgram.java:372)
        at org.apache.flink.client.program.PackagedProgram.invokeInteractiveModeForExecution(PackagedProgram.java:222)
        at org.apache.flink.client.ClientUtils.executeProgram(ClientUtils.java:114)
        at org.apache.flink.client.cli.CliFrontend.executeProgram(CliFrontend.java:812)
        at org.apache.flink.client.cli.CliFrontend.run(CliFrontend.java:246)
        at org.apache.flink.client.cli.CliFrontend.parseAndRun(CliFrontend.java:1054)
        at org.apache.flink.client.cli.CliFrontend.lambda$main$10(CliFrontend.java:1132)
        at java.security.AccessController.doPrivileged(Native Method)
        at javax.security.auth.Subject.doAs(Subject.java:422)
        at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1836)
        at org.apache.flink.runtime.security.contexts.HadoopSecurityContext.runSecured(HadoopSecurityContext.java:41)
        at org.apache.flink.client.cli.CliFrontend.main(CliFrontend.java:1132)
Caused by: org.springframework.beans.factory.xml.XmlBeanDefinitionStoreException: Line 8 in XML document from class path resource [ykt-dp.xml] is invalid; nested exception is org.xml.sax.SAXParseException; lineNumber: 8; columnNumber: 104; cvc-elt.1: Cannot find the declaration of element 'beans'.
        at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.doLoadBeanDefinitions(XmlBeanDefinitionReader.java:404)
        at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.loadBeanDefinitions(XmlBeanDefinitionReader.java:336)
        at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.loadBeanDefinitions(XmlBeanDefinitionReader.java:304)
        at org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:188)
        at org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:224)
        at org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:195)
        at org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:257)
        at org.springframework.context.support.AbstractXmlApplicationContext.loadBeanDefinitions(AbstractXmlApplicationContext.java:128)
        at org.springframework.context.support.AbstractXmlApplicationContext.loadBeanDefinitions(AbstractXmlApplicationContext.java:94)
        at org.springframework.context.support.AbstractRefreshableApplicationContext.refreshBeanFactory(AbstractRefreshableApplicationContext.java:133)
        at org.springframework.context.support.AbstractApplicationContext.obtainFreshBeanFactory(AbstractApplicationContext.java:636)
        at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:521)
        at org.springframework.context.support.ClassPathXmlApplicationContext.(ClassPathXmlApplicationContext.java:144)
        at org.springframework.context.support.ClassPathXmlApplicationContext.(ClassPathXmlApplicationContext.java:85)
        at com.yto.ykt.YktStarter.main(YktStarter.java:22)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:498)
        at org.apache.flink.client.program.PackagedProgram.callMainMethod(PackagedProgram.java:355)
        ... 11 more
Caused by: org.xml.sax.SAXParseException; lineNumber: 8; columnNumber: 104; cvc-elt.1: Cannot find the declaration of element 'beans'.
        at org.apache.xerces.util.ErrorHandlerWrapper.createSAXParseException(Unknown Source)
        at org.apache.xerces.util.ErrorHandlerWrapper.error(Unknown Source)
        at org.apache.xerces.impl.XMLErrorReporter.reportError(Unknown Source)
        at org.apache.xerces.impl.XMLErrorReporter.reportError(Unknown Source)
        at org.apache.xerces.impl.XMLErrorReporter.reportError(Unknown Source)
        at org.apache.xerces.impl.xs.XMLSchemaValidator.handleStartElement(Unknown Source)
        at org.apache.xerces.impl.xs.XMLSchemaValidator.startElement(Unknown Source)
        at org.apache.xerces.impl.XMLNSDocumentScannerImpl.scanStartElement(Unknown Source)
        at org.apache.xerces.impl.XMLNSDocumentScannerImpl$NSContentDispatcher.scanRootElementHook(Unknown Source)
        at org.apache.xerces.impl.XMLDocumentFragmentScannerImpl$FragmentContentDispatcher.dispatch(Unknown Source)
        at org.apache.xerces.impl.XMLDocumentFragmentScannerImpl.scanDocument(Unknown Source)
        at org.apache.xerces.parsers.XML11Configuration.parse(Unknown Source)
        at org.apache.xerces.parsers.XML11Configuration.parse(Unknown Source)
        at org.apache.xerces.parsers.XMLParser.parse(Unknown Source)
        at org.apache.xerces.parsers.DOMParser.parse(Unknown Source)
        at org.apache.xerces.jaxp.DocumentBuilderImpl.parse(Unknown Source)
        at org.springframework.beans.factory.xml.DefaultDocumentLoader.loadDocument(DefaultDocumentLoader.java:77)
        at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.doLoadDocument(XmlBeanDefinitionReader.java:434)
        at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.doLoadBeanDefinitions(XmlBeanDefinitionReader.java:392)
        ... 30 more

采用Yarn Session方式提交。提交失败。

异常中提到的ykt-dp.xml的文件内容及代码中解析的位置。


<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:aop="http://www.springframework.org/schema/aop"
       xmlns:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
        http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd">
    <aop:config/>
    <aop:aspectj-autoproxy proxy-target-class="true"/>
    <context:annotation-config/>
    <context:component-scan base-package="com.yto.ykt"/>

    <bean id="prop" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
        <property name="locations">
            <array>
                <value>classpath:main-settings.propertiesvalue>
            array>
        property>
    bean>
beans>
@SpringBootApplication(scanBasePackages = {"com.yto.ykt"})
@ImportResource(locations = "classpath:ykt-dp.xml")
public class YktStarter {
    public static void main(String[] args) throws Exception {
        if (args.length < 1) {
            System.exit(-1);
        }
        //在此处解析该xml文件,并解析失败。
        ApplicationContext context = new ClassPathXmlApplicationContext("ykt-dp.xml");
        DataExchangeService dataExchangeService = (DataExchangeService) context.getBean(args[0]);
        dataExchangeService.run(args);
    }
}

自己的思路

 首先,代码是可以在本地跑通的。
 我在代码中点击文件名是可以跳转到对应的文件的。文件之间的相互跳转都没有问题。
 xml文件中的中的约束点击之后也能跳转到对应的地方。
 报错信息中提到ykt-dp.xml了,并定位到了出错的行。说明并不是没有找到文件。而是在创建的过程中出了错误。

总结

目前工作卡到这一步了,而且没有具体的解决思路。希望见到的有识之人可以帮我解决一下这个问题。我百度中也没有找到合适的答案。尽量不要只贴一个百度出来的链接,如果觉得我提供的信息对不够定位问题。可以@我远程解决。如果远程解决问题。可额外50红包。红包只是心意,希望最终可以帮我解决问题。

可能是因为再集群环境中,缺少所需的XML Schema文件。可以尝试通过factory.setValidating(false)解决这个问题

这个异常是由于解析ykt-dp.xml文件时,程序无法找到元素‘beans’的声明,从而导致解析失败。可以检查以下内容:

  • 确认ykt-dp.xml文件中是否正确声明了‘beans’元素,一般情况下应该有以下声明:

    <beans xmlns="http://www.springframework.org/schema/beans"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
         <!--beans配置-->
    </beans>
    

    其中xsi:schemaLocation属性指定了Spring Bean的schema位置,检查是否正确。

  • 确认ykt-dp.xml文件是否被正确加载。可以使用以下代码读取并打印ykt-dp.xml文件的内容,以确认文件是否正确读取:

    InputStream inputStream = getClass().getClassLoader().getResourceAsStream("ykt-dp.xml");
    String xmlContent = IOUtils.toString(inputStream, "UTF-8");
    System.out.println(xmlContent);
    
  • 检查项目的Classpath中是否包含了Spring Bean的schema,可以尝试在本地运行程序,看是否存在以下文件:

    spring-beans-5.x.x.RELEASE.xsd
    

    如果以上步骤都检查正确,仍然无法解决问题,可以考虑升级Spring版本,或者联系Flink社区获取更多帮助。

该异常通常是由于 Spring 容器未能正确加载导致的。它表示解析 XML 配置文件时出现了错误。

根据错误信息中的信息,我们可以看到异常堆栈中有以下信息:

Caused by: org.springframework.beans.factory.xml.XmlBeanDefinitionStoreException: Line 8 in XML document from class path resource [ykt-dp.xml] is invalid; nested exception is org.xml.sax.SAXParseException; lineNumber: 8; columnNumber: 104; cvc-elt.1: Cannot find the declaration of element 'beans'.

从这段信息中可以看出,Spring 在解析 ykt-dp.xml 文件时出现了错误。具体来说,它无法找到 元素的声明,导致 XML 解析失败。

这种错误通常是由于 XML 文件格式错误或者文件位置不正确引起的。请检查以下几个方面:

1.确认 ykt-dp.xml 文件的位置和名称是否正确,并确保它在 classpath 中。
2.检查 ykt-dp.xml 文件是否正确格式化,没有语法错误,并且包含正确的 <!DOCTYPE> 声明和 XML 命名空间声明。建议使用现代的 XML 编辑器,如 IntelliJ IDEA、Eclipse 或 Visual Studio Code,来检查和格式化 XML 文件。
3.检查是否有其他配置文件,例如 application.properties 或 application.yml,与 ykt-dp.xml 冲突或覆盖了其中的某些配置。
希望这些提示能够帮助你找到问题并解决它。

看一下本地环境下: at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.doLoadBeanDefinitions(XmlBeanDefinitionReader.java:404)
这一行是 怎么执行的对比下吧。

https://www.baidu.com/link?url=WNFe2toaIJVV-KCMHno2UhK9-D4bpbCHwBII53lPlom8y6MEGB_orZp97Ku56y45DUpmV2KbLRuxg4cwNB934n2DONDJF09J6SpzsE5ovja&wd=&eqid=d5c4da6c000d5f710000000263ed8c60

问题解决了吗?

已经解决.我要结题了.

  • 重新配置你的Spring Configuration File,不使用XSD命名空间声明,避免使用bean等标签。

  • 检查你的XML文件是否有语法错误或缺少必要的元素,比如xml头部的声明,beans元素的开始和结束标签等。

  • 确保你的XML文件和你的SpringBoot项目的类路径一致,或者在你的application.properties文件中指定你的XML文件的位置。

不难的,就两个方向:
1、打包的环境不一样,可以对比下本地和集群的打包环境即可知道;
2、运行的环境不一样,可以对比下本地和集群的运行环境即可知道;