Der übereinstimmende Platzhalter ist streng, es kann jedoch keine Deklaration für den Kontext des Elements gefunden werden: Komponentenscan

71

Beim Versuch meines ersten Frühjahrsprojekts werden folgende Fehler angezeigt:

Caused by: org.xml.sax.SAXParseException: cvc-complex-type.2.4.c: The matching wildcard is strict, but no declaration can be found for element 'context:component-scan

Hier ist das applicationContext.xml:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:p="http://www.springframework.org/schema/p"
       xmlns:aop="http://www.springframework.org/schema/aop"
       xmlns:tx="http://www.springframework.org/schema/tx"
       xmlns:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
       http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd
       http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd">

        <context:component-scan base-package="com.xyz" />

</beans>

Was verursacht den Fehler?

user93796
quelle

Antworten:

145

Sie haben den Speicherort des Schemas des Kontext-Namespace nicht angegeben. Dies ist der Grund für diesen bestimmten Fehler:

<beans .....
  xmlns:context="http://www.springframework.org/schema/context"
  xsi:schemaLocation="
    http://www.springframework.org/schema/beans
    http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
    http://www.springframework.org/schema/aop
    http://www.springframework.org/schema/aop/spring-aop-2.5.xsd
    http://www.springframework.org/schema/tx
    http://www.springframework.org/schema/tx/spring-tx-2.5.xsd
    http://www.springframework.org/schema/context
    http://www.springframework.org/schema/context/spring-context.xsd">
Biju Kunjummen
quelle
1
Mein Problem war, dass ich einen falschen Schemaort angegeben habe . Überprüfen Sie es besser oder kopieren Sie es von hier aus.
Vadipp
Der Fehler verschwand NUR, wenn der vorhandene "xmlns: context" direkt vor der Spezifikation "xsi: schemaLocation" platziert wurde. Danke für den Vorschlag.
tm1701
+1. Diese Antwort könnte verbessert werden, indem hervorgehoben wird, was zwischen der Antwort und dem Op-Code unterschiedlich ist, oder indem das Beispiel nur auf die entsprechenden Zeilen reduziert wird.
Madbreaks
Ich folgte dem Kurs "O'Reilly - Spring Framework Essentials" und hatte einen solchen Fehler. Es stellte sich heraus, dass ein Kurs einen Tippfehler aufwies : Anstelle von " springframework.org/schema/context/spring-context.xsd " hatten sie ein falsches " springframework.org/schema/beans/spring-context.xsd ". Sie nicht zu beschuldigen, da nichts perfekt ist, aber es hier zu posten, vielleicht hilft es jemandem.
AbstractVoid
7

Dieser Pfad des Schema-Speicherorts ist falsch:

http://www.springframework.org/schema/beans

Der richtige Pfad sollte enden mit /:

http://www.springframework.org/schema/beans/
Sahil Bhalla
quelle
1
Ich bin mir nicht sicher, ob das stimmt.
RSLJ
3
Der abschließende Schrägstrich ist für das Problem irrelevant. Diese Antwort sollte nicht so viele Up-Votes haben wie derzeit.
Scarfe
6

Ich hatte Probleme mit

Caused by: org.xml.sax.SAXParseException: cvc-complex-type.2.4.c: The matching wildcard is strict, but no declaration can be found for element 'security:http'

und für mich musste ich das spring-security-config jar zum klassenpfad hinzufügen

http://docs.spring.io/spring-security/site/docs/3.1.x/reference/ns-config.html

BEARBEITEN:

Es kann sein, dass Sie die richtige Abhängigkeit in Ihrem Pom haben.

Aber...

Wenn Sie mehrere Federabhängigkeiten verwenden und zu einem einzigen Glas zusammenfügen, wird die META-INF/spring.schemaswahrscheinlich von spring.schemaseiner anderen Ihrer Frühlingsabhängigkeiten überschrieben .

(Extrahieren Sie diese Datei aus Ihrem zusammengestellten Glas und Sie werden verstehen)

Frühlingsschemata sind nur ein paar Zeilen, die so aussehen:

http\://www.springframework.org/schema/p=org.springframework.beans.factory.xml.SimplePropertyNamespaceHandler
http\://www.springframework.org/schema/beans/spring-beans-3.0.xsd=org/springframework/beans/factory/xml/spring-beans-3.0.xsd

Wenn jedoch eine andere Abhängigkeit diese Datei überschreibt, wird die Definition von http abgerufen, und wenn Sie über eine Firewall / einen Proxy verfügen, kann diese nicht abgerufen werden.

Eine Lösung besteht darin, spring.schemas und spring.handlers in einer einzigen Datei anzuhängen.

Prüfen:

Idee zu vermeiden, dass spring.handlers / spring.schemas überschrieben werden, wenn mehrere Federabhängigkeiten in einem einzigen Glas zusammengeführt werden

David Rz Ayala
quelle
Diese Art half mir, das Problem zu identifizieren, mit dem ich konfrontiert war. Ich hatte verpassten Zugabe spring-webAbhängigkeit in der pom
Ringträger
Stellen Sie außerdem sicher, dass, wenn Sie im Header xsi: schemaLocation eine bestimmte Version eines Spring-Schemas angeben, diese mit den Versionen dieses Schemas übereinstimmt, die in der Datei spring.schemas aufgeführt und in diesem Spring-Jar gebündelt sind.
Matthew Wise
Ich hatte genau das gleiche Problem im Zusammenhang mit Sicherheit http. Grundursache war ein fehlendes Spring-Security-Konfigurationsglas. Das Hinzufügen dieses JARs als Maven-Abhängigkeit zur Kompilierungszeit löste das Problem für mich.
Nirmalsingh
4

Dieser Fehler kann auch verursacht werden, wenn die JAR-Datei, die die von Ihnen benötigte XSD enthält, nicht in Ihrem bereitgestellten Klassenpfad enthalten ist.

Stellen Sie sicher, dass die Abhängigkeiten in Ihrem Container verfügbar sind.

sweetfa
quelle
1
Ich hatte das Problem im Zusammenhang mit Sicherheit http oben in David Antwort erklärt. Grundursache war ein fehlendes Spring-Security-Konfigurationsglas. Das Hinzufügen dieses JARs als Maven-Abhängigkeit zur Kompilierungszeit löste das Problem für mich.
Nirmalsingh
3

Wenn Sie STS verwenden , können Sie in Eclipse die Konfigurationsdatei als "Bean Configuration" -Datei markieren (Sie können dies beim Erstellen oder Klicken mit der rechten Maustaste auf eine XML-Datei angeben):

Spring Tools> Als Bean-Konfiguration hinzufügen

Ihr Projekt muss Spring Nature haben (klicken Sie zum Beispiel mit der rechten Maustaste auf das Maven-Projekt):

Frühlingswerkzeuge> Frühlingsprojekt Natur hinzufügen

wird dann spring.xmlstandardmäßig mit dem Spring Config Editor geöffnet

Öffnen Sie mit> Spring Config Editor

und dieser Editor hat die Registerkarte Namespaces

Spring Config Editor - Registerkarte Namespaces

Damit können Sie die Namespaces angeben:

Spring Config Editor - Beispiel für Namespaces

Bitte beachten Sie, dass dies von Abhängigkeiten abhängt (mithilfe des Maven-Projekts). Wenn dies spring-txalso nicht in der pom.xml von maven definiert ist, ist die Option nicht vorhanden, wodurch dies verhindert wird. Der passende Platzhalter ist streng, es kann jedoch keine Deklaration für das Element gefunden werden 'tx: annotationsgesteuerter' 'Kontext: Komponenten-Scan' Problem ...

Betlista
quelle
3

Es ist zu spät, kann aber für andere nützlich sein

Der übereinstimmende Platzhalter ist streng, es kann jedoch keine Deklaration für den Kontext des Elements gefunden werden: Komponentenscan

Dies bedeutet, dass Sie einige Deklarationen verpasst haben oder die erforderlichen Deklarationen nicht in Ihrem XML gefunden wurden

In meinem Fall habe ich vergessen, das Folgende hinzuzufügen

Nach dem Hinzufügen ist das Problem verschwunden

<?xml version="1.0" encoding="UTF-8"?>
<beans:beans xmlns="http://www.springframework.org/schema/mvc"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:beans="http://www.springframework.org/schema/beans"
    xmlns:context="http://www.springframework.org/schema/context"
    xmlns:tx="http://www.springframework.org/schema/tx"
    xsi:schemaLocation="http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd
        http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
        http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.0.xsd
        http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.0.xsd">
RAJESH KUMAR ARUMUGAM
quelle
2

Wenn Sie Kontext hinzufügen: Komponenten-Scan zum ersten Mal in einer XML-Datei, muss Folgendes hinzugefügt werden.

xmlns:context="http://www.springframework.org/schema/context"

xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
harishpatarla
quelle
1

Mit der Namespace-Deklaration und dem Schema-Speicherort können Sie auch die Syntax des verwendeten Namespace überprüfen, zum Beispiel: -

<beans xmlns:context="http://www.springframework.org/schema/context"
        xsi:schemaLocation= http://www.springframework.org/`enter code here`schema/context
        http://www.springframework.org/schema/context/spring-context.xsd">

<context:annotation-driven/>   <!-- This is wrong -->
<context:annotation-config/> <!-- This should work -->
Amit
quelle
1

Fügen Sie den XML-Kontext mit http hinzu, wie unten gezeigt

xmlns:context="http://www.springframework.org/schema/context"

Manjunatha B.
quelle
1
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context"
    xsi:schemaLocation="http://www.springframework.org/schema/beans 
           http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
           http://www.springframework.org/schema/context
           http://www.springframework.org/schema/context/spring-context-3.0.xsd">

Die obigen Links müssen enthalten sein

    <context:property-placeholder location="classpath:sport.properties" />


    <bean id="myFortune" class="com.kiran.springdemo.HappyFortuneService"></bean>

    <bean id="myCoach" class="com.kiran.springdemo.setterinjection.MyCricketCoach">
        <property name="fortuner" ref="myFortune" />

        <property name="emailAddress" value="${ipl.email}" />
        <property name="team" value="${ipl.team}" />

    </bean>


</beans>
Vanga Kiran Kumar Reddy
quelle
1

Fügen Sie diese beiden Schema-Speicherorte hinzu. Das ist genug und effizient, anstatt alle unnötigen Schemata hinzuzufügen

 http://www.springframework.org/schema/context
 http://www.springframework.org/schema/context/spring-context.xsd
Sonnenstrahlen
quelle
1

In verschiedenen Spring-Gläsern befinden sich 'META-INF / spring.schemas'-Dateien, die die Zuordnungen für die URLs enthalten, die für die lokale Auflösung abgefangen werden. Wenn eine bestimmte xsd-URL in diesen Dateien nicht aufgeführt ist (z. B. nach dem Wechsel von http zu https), versucht Spring, Schemas aus dem Internet zu laden. Wenn das System keine Internetverbindung hat, schlägt dies fehl und verursacht diesen Fehler.

Dies kann bei Spring Security v5.2 und höher der Fall sein, wenn für die xsd-Datei keine http-Zuordnung vorhanden ist.

Um das Problem zu beheben, ändern Sie es

xsi:schemaLocation="
    http://www.springframework.org/schema/beans     
    http://www.springframework.org/schema/beans/spring-beans.xsd
    http://www.springframework.org/schema/security  
    http://www.springframework.org/schema/security/spring-security.xsd"

zu

xsi:schemaLocation="
    http://www.springframework.org/schema/beans     
    https://www.springframework.org/schema/beans/spring-beans.xsd
    http://www.springframework.org/schema/security  
    https://www.springframework.org/schema/security/spring-security.xsd"

Beachten Sie, dass nur die tatsächliche xsd-URL von http in https geändert wurde (nur zwei Stellen oben).

mp31415
quelle
0

Ändern Sie http in http s des markierten Fehlers oder die gesamte URL, die mit der Erweiterung * .xsd endet.

Mutaealim
quelle