匹配的通配符是严格的,但是找不到元素'context:component-scan的声明

时间:2012-11-27 17:14:33

标签: java spring

我在尝试第一个春季项目时遇到以下错误:

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

以下是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>

导致错误的原因是什么?

15 个答案:

答案 0 :(得分:130)

您尚未指定上下文命名空间的架构位置,这就是此特定错误的原因:

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

答案 1 :(得分:6)

架构位置的这条路径是错误的:

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

正确的路径应以/结尾:

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

答案 2 :(得分:5)

我遇到了

的问题
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'

对我来说,我必须将spring-security-config jar添加到类路径

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

编辑:

可能是你的pom中有正确的依赖。

但是...

如果您使用多个spring依赖项并组装到一个jar中,那么META-INF/spring.schemas可能会被另一个spring依赖项的spring.schemas覆盖。

(从已组装的jar中提取该文件,您将理解)

Spring模式只是一堆看起来像这样的行:

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

但是如果另一个依赖项覆盖了该文件,那么将从http中检索定义,如果你有防火墙/代理,它将无法获取它。

一种解决方案是将spring.schemas和spring.handlers附加到单个文件中。

检查:

Idea to avoid that spring.handlers/spring.schemas get overwritten when merging multiple spring dependencies in a single jar

答案 3 :(得分:3)

如果包含所需XSD的jar文件未包含在已部署的类路径中,也会导致此错误。

确保容器中的依赖项可用。

答案 4 :(得分:3)

如果使用STS,您可以在Eclipse中将配置文件标记为“Bean Configuration”文件(您可以在创建或右键单击XML文件时指定):

Spring Tools > Add as Bean Configuration

你的项目必须有Spring Nature(例如右键单击maven项目):

Spring Tools > Add Spring Project Nature

然后默认情况下使用Spring Config Editor打开spring.xml

Open With > Spring Config Editor

此编辑器具有命名空间选项卡

Spring Config Editor - Namespaces tab

使您可以指定命名空间:

Spring Config Editor - Namespaces example

请注意,这取决于依赖项(使用maven项目),因此如果未在maven的pom.xml中定义spring-tx,则不存在选项,这会阻止您遇到The matching wildcard is strict, but no declaration can be found for element 'tx:annotation-driven' 'context:component-scan'问题...

答案 5 :(得分:3)

现在为时已晚,但有些可能对其他人有用

  

匹配的通配符是严格的,但是找不到声明   元素'上下文:组件扫描

表示您在XML中错过了一些声明或必需的声明未找到

在我的情况下,我忘了添加以下内容

添加此问题后消失

<?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">

答案 6 :(得分:1)

当您在xml中首次添加上下文:component-scan时,需要添加以下内容。

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

答案 7 :(得分:1)

各种Spring jar中都有“ META-INF / spring.schemas”文件,其中包含针对本地解析而截获的URL的映射。如果这些文件中未列出特定的xsd URL(例如,从http切换到https之后),Spring会尝试从Internet加载架构,如果系统没有Internet连接,它将失败并导致此错误。

在Spring Security v5.2及更高版本中可能就是这种情况,xsd文件没有http映射。

要解决此问题,请更改

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"

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"

请注意,只有实际的xsd URL从http修改为https(上面仅两个位置)。

答案 8 :(得分:0)

正确的路径不应该以“/”结尾,我错了造成了麻烦

正确的方式:

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

答案 9 :(得分:0)

使用名称空间声明和模式位置,您还可以检查名称空间使用的语法,例如:-

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

答案 10 :(得分:0)

使用http添加xmlns上下文,如下所示

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

答案 11 :(得分:0)

<?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">

需要包含以上链接

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

答案 12 :(得分:0)

添加这两个架构位置。这样就足够了,而不需要添加所有不必要的模式

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

答案 13 :(得分:0)

将标记错误或所有以* .xsd扩展名结尾的URL的 http 更改为 http s

答案 14 :(得分:0)

这里有一种可能性没有提到,但我认为很重要。

通常,当您执行验证时,应该根据提供的 xsi:schemaLocaation 参数来完成,即如果验证器没有在上下文中加载架构,它会尝试从提供的位置卸载它。 然而,默认情况下,Java 使用的 Xerces 解析器启用了一个名为 USE_GRAMMAR_ONLY_POOL_FEATURE (https://docs.mongodb.com/manual/reference/operator/query/or/) 的标志,它禁止任何卸载模式。因此,如果您尚未在验证器的语法池中预加载架构,您将遇到该消息。

使问题进一步复杂化的是无法直接在验证器中启用该功能。您必须在更广泛的架构工厂范围内启用它:

SchemaFactory sf = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
try {
    sf.setFeature(Constants.XERCES_FEATURE_PREFIX + Constants.USE_GRAMMAR_POOL_ONLY_FEATURE, false);
    ...
}