org.xml.sax.SAXParseException: cvc-complex-type.2.4.c: соответствующий подстановочный знак является строгим - PullRequest
3 голосов
/ 20 марта 2012
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 к моему весеннему XML.Я сделал некоторые поиски и похоже это проблема classpath.Какую зависимость я здесь упускаю?

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

4 голосов
/ 20 марта 2012

Эта ошибка возникает из-за невозможности найти Drools XSD. В этом комментарии в списке пользователей Drools указано, что XSD не являются общедоступными, а атрибут xsi:schemaLocation в XML отображает этот 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". Один из JAR-файлов Drools должен включать файл META-INF/spring.handlers, определяющий отображение XSD для пространства имен drools. Что-то вроде:

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

Который должен автоматически обрабатывать XSD-файл, включенный в JAR-файлы Drools.

Попробуйте удалить последние две строки вашего атрибута xsi:schemaLocation, чтобы Spring автоматически разрешил XSD.

Некоторые ссылки по теме:

Конечно, вы также можете извлечь этот XSD из файла JAR, поместить его в доступный каталог из вашего classpath и использовать относительный URL-адрес classpath в xsi:schemaLocation.

Кстати, это, вероятно, ошибка копирования и вставки, но у вашего <beans> элемента отсутствует закрывающий тег.

РЕДАКТИРОВАТЬ : Похоже, что Drools не предоставил spring.handlers должным образом (по крайней мере, по состоянию на декабрь 2010 г. см. Drools + Spring без интернета ). Возможно, вам придется копаться в JAR-файлах, чтобы получить XSD и ссылаться на него непосредственно в xsi:schemaLocation.

0 голосов
/ 26 февраля 2016

Что касается маркера ошибки в Eclipse : у меня есть только обходной путь, и я сомневаюсь, что для этого есть реальное решение. Как сказал Хави Лопес в своем принятом ответе, в банке слюни-пружина есть файл 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 в проекте, что - для вашего удобства - выглядит так:

  • Выберите ваш проект в Package Explorer, нажмите File / Properties (или нажмите Alt + Enter)
  • В диалоговом окне Свойства для проекта выберите Валидация
  • Проверка Включить специфические настройки проекта (отключить проверку только для этого проекта)
  • Снимите отметку Вручную и Сборка для: Валидатор схемы XML
  • Нажмите ОК
  • Щелкните правой кнопкой мыши по проекту и выберите Проверить (для повторной проверки проекта с измененными настройками)

(Я также пытался ссылаться на xsd непосредственно из определения xml bean-компонентов Spring, но он не работал. Поскольку обработчик, определенный в файле spring-handlers, работает во время выполнения, это не будет лучшим обходным путем IMHO.)

...