org.xml.sax.SAXParseException: cvc-complex-type.2.4.c: 匹配通配符严格

3
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'. 

当我在spring xml中添加网格节点和ksession时,出现了这个错误。经过一些搜索,看起来像是一个类路径问题。我缺少哪些依赖项?

<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个回答

5
这个错误是由于无法找到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应该自动处理XSD分辨率,给定xmlns:drools="http://drools.org/schema/drools-spring"属性。其中一个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中引用它。


谢谢您提供这些链接和细节。然而,我已经拥有了大部分内容,但仍然出现相同的错误:( - Soumya Simanta
你尝试过将 xsd 文件(我们称之为 drools-spring.xsd)放在 applicationContext.xml 旁边,并直接在 xsi:schemaLocation 中引用它吗?像这样:http://drools.org/schema/drools-spring org/drools/container/spring drools-spring.xsd?此外,你是否正在生成一个包含所有依赖和模块的单个 JAR 文件?如果是这种情况,META-INF/spring.handlers 文件可能会被覆盖。如果是这种情况,请参见 Problem starting Spring application from Java - Xavi López
1
我正在使用Maven创建WAR文件。 我在我的Spring XML中有以下内容。http://drools.org/schema/drools-spring http://drools.org/schema/drools-spring-1.5.0.xsd。添加<dependency> <groupId> org.drools </ groupId> <artifactId> drools-spring </ artifactId> <version> $ {drools.version} </ version> </ dependency>获取了具有META-INF / spring.handlers的drools-spring-5.3.0.Final.jar。我删除了我的maven缓存(.m2 / repository),现在看起来它正常工作(至少在运行时我没有得到异常)。但是,我仍然在Eclipse上收到错误标记。 - Soumya Simanta

0
关于Eclipse中的错误标记:我只有一个解决方法,而且我怀疑这个问题没有真正的解决方案。 正如Xavi Lopez在他的答案中所述,在drools-spring jar(对我来说是drools-spring-5.3.0.Final.jar)的META-INF下有一个spring-handlers文件。然而,它并没有引用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 Tool Suite)一起工作。

我总是最终关闭项目中xsd文件的验证,方法如下:

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

(我还尝试直接从Spring bean定义xml引用xsd,但它没有起作用。由于在spring-handlers文件中定义的处理程序在运行时起作用,因此这不会是更好的解决方法。)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接