Je reçois les erreurs suivantes en essayant mon premier projet de printemps:
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
Voici le 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>
Quelle est la cause de l'erreur?
Vous n'avez pas spécifié l'emplacement du schéma de l'espace de noms de contexte, c'est la raison de cette erreur spécifique:
<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">
Ce chemin de l'emplacement du schéma est incorrect:
http://www.springframework.org/schema/beans
Le chemin correct doit se terminer par /
:
http://www.springframework.org/schema/beans/
J'avais des problèmes avec
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'
et pour moi je devais ajouter le pot Spring-security-config au classpath
http://docs.spring.io/spring-security/site/docs/3.1.x/reference/ns-config.html
MODIFIER:
Il se peut que vous ayez la bonne dépendance dans votre pom.
Mais...
Si vous utilisez plusieurs dépendances de ressort et que vous les assemblez dans un seul fichier jar, le META-INF/spring.schemas
est probablement remplacé par le spring.schemas
d'un autre de vos dépendances de ressort.
(Extrait ce fichier de votre pot assemblé et vous comprendrez)
Les schémas de printemps sont juste un tas de lignes qui ressemblent à ceci:
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
Mais si une autre dépendance écrase ce fichier, la définition sera extraite de http et si vous avez un pare-feu/proxy, il ne pourra pas l'obtenir.
Une solution consiste à ajouter spring.schemas et spring.handlers dans un fichier unique.
Vérifier:
Cette erreur peut également être provoquée si le fichier JAR contenant le fichier XSD requis n'est pas inclus dans votre chemin de classe déployé.
Assurez-vous que les dépendances sont disponibles dans votre conteneur.
Si vous utilisez STS , vous pouvez marquer Eclipse le fichier de configuration en tant que fichier "Configuration de bean" (vous pouvez spécifier cela lors de la création ou en effectuant un clic droit sur un fichier XML):
Votre projet doit avoir Spring Nature (clic droit sur le projet maven par exemple):
alors spring.xml
est ouvert par défaut avec Spring Config Editor
et cet éditeur a un onglet Namespaces
Ce qui vous permet de spécifier les espaces de noms:
Sachez que cela dépend des dépendances (avec le projet maven), donc si spring-tx
n'est pas défini dans le fichier pom.xml de maven, l'option n'existe pas, ce qui vous empêche d'avoir Le caractère générique correspondant est strict, mais aucune déclaration ne peut l'être trouvé pour l'élément 'tx: indexé' 'contexte: composant-scan' problem ...
lorsque vous ajoutez un contexte: composant-scan pour la première fois dans un fichier XML, vous devez ajouter les éléments suivants.
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">
C'est trop tard mais peut être utile pour d'autres
Le caractère générique correspondant est strict, mais aucune déclaration ne peut être trouvée pour élément 'contexte: composant-scan
ce qui signifie que vous avez omis des déclarations ou les déclarations requises non trouvées dans votre fichier XML
Dans mon cas j'ai oublié d'ajouter le suivant
Après avoir ajouté cela, le problème a disparu
<?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">
Avec la déclaration d'espace de nom et l'emplacement du schéma, vous pouvez également vérifier la syntaxe de l'utilisation de l'espace de nom, par exemple: -
<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 -->
Ajouter un contexte XML avec http comme indiqué ci-dessous
xmlns:context="http://www.springframework.org/schema/context"
Ajoutez ces deux emplacements de schéma. C'est suffisant et efficace au lieu d'ajouter tout le schéma inutile
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
Le chemin correct ne doit pas se terminer par "/", je me suis trompé et a causé le problème
La bonne façon:
http://www.springframework.org/schema/contexthttp://www.springframework.org/schema/context/spring-context.xsd
<?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">
Les liens ci-dessus doivent être inclus
<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>