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添加grid-node和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>
答案 0 :(得分: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
,而不是xmlns:drools="http://drools.org/schema/drools-spring"
解决正确的XSD。
Spring应该在给定META-INF/spring.handlers
属性的情况下自动处理XSD分辨率。其中一个Drools JAR应该包含一个drools
文件,用于定义http://drools.org/schema/drools-spring=some.classpath.visible.package.xsdfile.xsd
命名空间的XSD映射。有点像:
xsi:schemaLocation
应该自动处理Drools JAR中包含的XSD文件。
尝试删除xsi:schemaLocation
属性的最后两行,以便让Spring自动解析XSD。
一些相关链接:
当然,您也可以从JAR文件中提取该XSD,将其放在类路径的可访问目录中,并在<beans>
中使用类路径相对URL。
顺便说一句,它可能是一个复制和粘贴错误,但是您的spring.handlers
元素缺少其结束标记。
编辑:似乎Drools未正确提供xsi:schemaLocation
(至少截至2010年12月,请参阅Drools + Spring without internet )。您可能需要深入了解JAR以获取XSD并直接在{{1}}中引用它。
答案 1 :(得分:0)
至于 Eclipse中的错误标记:我只有一个解决方法,我怀疑是否有一个真正的解决方案。
正如Xavi Lopez在他接受的答案中所述,drools-spring jar中有一个spring-handlers
文件(对我而言,drools-spring-5.3.0.Final.jar
),在 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 Tool Suite)。
我总是最终关闭项目中xsd文件的验证,为方便起见,这样做:
(我也尝试直接从spring bean定义xml引用xsd,但它不起作用。由于spring-handlers
文件中定义的处理程序在运行时工作,这不是一个更好的解决方法恕我直言。 )