有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java组织。xml。萨克斯。SAXParseException:cvccomplextype。2.4.c:匹配的通配符是严格的

org.xml.sax.SAXParseException: cvc-complex-type.2.4.c: The matching wildcard is strict, but no declaration can be found for element 'drools:grid-node'. 

当我将网格节点和ksession添加到SpringXML时,我遇到了这个错误。我做了一些搜索,看起来这是一个类路径问题。我在这里错过了什么

<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:camel="http://camel.apache.org/schema/spring"
    xmlns:context="http://www.springframework.org/schema/context"
    xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:jaxrs="http://cxf.apache.org/jaxrs"
    xmlns:drools="http://drools.org/schema/drools-spring"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
       http://www.springframework.org/schema/beans/spring-beans.xsd
       http://camel.apache.org/schema/spring
       http://camel.apache.org/schema/spring/camel-spring.xsd
       http://www.springframework.org/schema/context 
       http://www.springframework.org/schema/context/spring-context-3.0.xsd
       http://www.springframework.org/schema/mvc
       http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd
       http://cxf.apache.org/jaxrs http://cxf.apache.org/schemas
       http://cxf.apache.org/jaxrs http://cxf.apache.org/schemas/jaxrs.xsd
       http://drools.org/schema/drools-spring org/drools/container/spring
       http://drools.org/schema/drools-spring org/drools/container/spring/drools-spring-1.2.0.xsd">


    <drools:grid-node id="node1"/>
    <drools:ksession id="ksession1" type="stateful" kbase="kbase1" node="node1" />

我的pom。xml对Drools具有以下特性

               <dependency>
        <groupId>org.drools</groupId>
        <artifactId>drools-camel</artifactId>
        <version>${drools.version}</version>
        <exclusions>
            <!-- This ensures that we use the latest version of Spring jars and not 
                the one that comes with drools.version. -->
            <exclusion>
                <groupId>org.springframework</groupId>
                <artifactId>spring</artifactId>
            </exclusion>

            <exclusion>
                <groupId>org.apache.camel</groupId>
                <artifactId>camel-core</artifactId>
            </exclusion>

            <exclusion>
              <groupId>org.apache.camel</groupId>
              <artifactId>camel-spring</artifactId>
            </exclusion>



            <exclusion>
                <artifactId>camel-xstream</artifactId>
                <groupId>org.apache.camel</groupId>
            </exclusion>
        </exclusions>
    </dependency>
    <dependency>
        <groupId>org.drools</groupId>
        <artifactId>knowledge-api</artifactId>
        <version>${drools.version}</version>
    </dependency>

    <dependency>
        <groupId>org.drools</groupId>
        <artifactId>drools-core</artifactId>
        <version>${drools.version}</version>
    </dependency>


    <dependency>
        <groupId>org.drools</groupId>
        <artifactId>drools-compiler</artifactId>
        <version>${drools.version}</version>
    </dependency>


    <dependency>
        <groupId>org.drools</groupId>
        <artifactId>drools-spring</artifactId>
        <version>${drools.version}</version>
    </dependency>

共 (2) 个答案

  1. # 1 楼答案

    至于Eclipse中的错误标记:我只有一个解决方法,我怀疑是否有真正的解决方法。 正如哈维·洛佩兹在他接受的答案中所说,drools spring jar(对我来说,drools-spring-5.3.0.Final.jar)中有一个spring-handlers文件,在META-INF下。但是,这并不引用xsd文件(尽管xsd文件就位于这个jar中),而是包含以下内容:

    http\://drools.org/schema/drools-spring=org.drools.container.spring.namespace.SpringDroolsHandler
    http\://drools.org/schema/drools-spring-1.2.0=org.drools.container.spring.namespace.SpringDroolsHandler
    http\://drools.org/schema/drools-spring-1.3.0=org.drools.container.spring.namespace.SpringDroolsHandler
    http\://drools.org/schema/drools-spring-1.4.0=org.drools.container.spring.namespace.SpringDroolsHandler
    http\://drools.org/schema/drools-spring-1.5.0=org.drools.container.spring.namespace.SpringDroolsHandler
    

    如您所见,它为xsd的每个版本定义了一个处理程序类。这在运行时与spring配合得很好,但我从未见过它与任何版本的Eclipse(或spring工具套件)配合使用

    我总是关闭项目中xsd文件的验证,为方便起见,如下所示:

    • 在包资源管理器中选择项目,单击文件/属性(或按Alt+Enter)
    • 在项目的属性对话框中,选择验证
    • 选中“启用项目特定设置”(仅对此项目禁用验证)
    • 取消选中XML模式验证器的手动构建
    • 按OK
    • 在项目上单击鼠标右键,然后选择“验证”(使用修改的设置重新验证项目)

    (我还试图直接从SpringBeans定义xml引用xsd,但没有成功。由于spring-handlers文件中定义的处理程序在运行时工作,这不是一个更好的解决办法。)

  2. # 2 楼答案

    由于无法定位Drools XSD,因此发出此错误。在Drools用户列表中的this comment中,声明XSD不是公开可用的,XML中的xsi:schemaLocation属性将该XSD映射到http://drools.org/schema/drools-spring org/drools/container/spring/drools-spring-1.2.0.xsd,而该属性不会解析为正确的XSD

    Spring应该自动处理给定xmlns:drools="http://drools.org/schema/drools-spring"属性的XSD解析。其中一个Drools JAR应该包含一个META-INF/spring.handlers文件,该文件定义了drools命名空间的XSD映射。大致如下:

    http://drools.org/schema/drools-spring=some.classpath.visible.package.xsdfile.xsd
    

    它应该自动处理Drools JAR中包含的XSD文件

    尝试删除xsi:schemaLocation属性的最后两行,以便让Spring自动解析XSD

    一些相关链接:

    当然,您也可以从JAR文件中提取XSD,将其放在类路径中的可访问目录中,并在xsi:schemaLocation中使用类路径相对URL

    顺便说一句,这可能是一份拷贝&;粘贴错误,但是<beans>元素缺少结束标记

    编辑:Drools似乎没有正确地提供spring.handlers(至少截至2010年12月,请参见Drools + Spring without internet )。您可能需要挖掘JAR以获取XSD并直接在xsi:schemaLocation中引用它