2012-03-20 70 views
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'. 

当我添加一个网格节点和ksession我的Spring XML我得到这个错误。我做了一些搜索,看起来像是一个类路径问题。我在这里缺少什么依赖性?org.xml.sax.SAXParseException:CVC-复杂type.2.4.c:匹配通配符是严格

<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> 

回答

4

由于无法找到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应该包含定义drools名称空间的XSD映射的META-INF/spring.handlers文件。沿线的东西:

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中引用它。

+0

感谢您提供这些链接和详细信息。然而,我有这个大部分,它仍然给我同样的错误:( – 2012-03-20 16:37:13

+0

)你有没有尝试将'xConf.xml'(让我们命名为'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'文件可能会被覆盖,如果是这样的话,请参阅[从Java开始的Spring应用程序启动问题](http://stackoverflow.com/ q/3650252/851811) – 2012-03-20 16:53:14

+1

我正在使用Maven创建一个WAR文件,在我的Spring XML中有以下内容:http://drools.org/schema/drools-spring http://drools.org/schema /drools-spring-1.5.0.xsd。加入\t \t \t \t \t org.drools \t \t \t 滴料弹簧 \t \t \t $ {} drools.version 得到滴料,弹簧5.3.0.Final.jar它具有META-INF /spring.handlers。我删除了我的maven缓存(.m2/repository),看起来它现在工作正常(至少在运行时我没有得到异常。)但是,我仍然在Eclipse上得到一个错误标记。 – 2012-03-20 17:13:08

0

至于Eclipse中的错误标记:我只有一种解决方法,我怀疑是否有真正的解决方案。 正如Xavi Lopez在他接受的答案中所述,在drools-spring jar中有spring-handlers文件(对我来说,drools-spring-5.3.0.Final.jar),在下有META-INF。然而,这不引用XSD文件(虽然XSD文件驻留在这个罐子),但包含此:

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文件,这些文件 - 为您提供便利 - 是这样的:

  • 选择Package Explorer中的项目,单击文件/属性(或按Alt + Enter键)
  • 属性项目对话框中,选择验证
  • 检查启用项目特定设置(禁用验证仅此项目)
  • 取消选中手册构建为:XML架构验证
  • 按OK
  • 在项目上右键单击并选择验证(重新验证与修改的设置项目)

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

相关问题