2012-03-20 66 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文件中定義的處理程序在運行時工作,這不會是一個更好的解決方法恕我直言。)

相關問題