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


71

尝试我的第一个春季项目时出现以下错误:

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>

是什么导致错误?

Answers:


145

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

<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
我的问题是我指定了错误的架构位置。最好仔细检查一下,或者从这里复制/粘贴。
vadipp

仅当将现有的“ xmlns:context”放在“ xsi:schemaLocation”规范之前时,该错误才会消失。谢谢你的建议。
tm1701

+1。可以通过突出显示答案和op的代码之间的区别或仅将示例简化为相关的行来改善此答案。
Madbreaks

我正在学习“ O'Reilly-Spring Framework Essentials”课程,并遇到了这样的错误。原来这门课程有错字:不是正确的“ springframework.org/schema/context/spring-context.xsd ”,而是错误的“ springframework.org/schema/beans/spring-context.xsd ”。不要责怪他们,因为没有什么是完美的,而是将其发布在此处,也许会对某人有所帮助。
AbstractVoid18

7

模式位置的此路径错误:

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

正确的路径应以/:结尾

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

1
我不太确定这是真的。
rslj

3
尾部的斜杠与问题无关。该答案的投票数应该不如当前的数字高。
Scarfe

6

我当时有问题

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.schemas您的另一个spring依赖项的覆盖。

(从组装好的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附加到单个文件中。

检查:

避免在单个jar中合并多个spring依赖项时覆盖spring.handlers / spring.schemas的想法


这种帮助我发现了我面临的问题。我错过了spring-web在pom中添加依赖项的内容
环形承载者

还请确保,如果您在xsi:schemaLocation标头中指定了Spring模式的特定版本,则该版本与在spring.schemas文件中列出并捆绑在该Spring jar中的模式的版本匹配。
马修·怀斯

我遇到了与安全http相关的完全相同的问题。根本原因是缺少spring-security-config jar。添加此jar作为编译时maven依赖关系为我解决了这个问题。
nirmalsingh

4

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

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


1
我有与安全性http有关的问题,上面在David答案中已说明。根本原因是缺少spring-security-config jar。添加此jar作为编译时maven依赖关系为我解决了这个问题。
nirmalsingh

3

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

Spring Tools>添加为Bean配置

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

Spring Tools>添加Spring项目自然

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

打开方式> Spring Config Editor

这个编辑器有命名空间标签

Spring Config Editor-命名空间选项卡

这使您可以指定名称空间:

Spring Config Editor-命名空间示例

请注意,它取决于依赖关系(使用maven项目),因此,如果spring-tx未在maven的pom.xml中定义,则不存在该选项,这将阻止您使用匹配的通配符是严格的,但是找不到元素的声明'tx:注释驱动''上下文:组件扫描'问题...


3

为时已晚,但对其他人可能有所帮助

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

这意味着您错过了一些声明或在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">

2

当您第一次在xml中添加context: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">


1

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

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

1

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

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


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

以上链接需要包括在内

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

1

添加这两个架构位置。足够而高效,而不是添加所有不必要的模式

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

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(仅在上面两个地方)。


0

更改HTTPHTTP小号标记错误或全部*扩展名为.xsd结束的URL。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.