Disallow self-closing on HTML void elements

本文解决Vue CLI 3中带有ESLint的项目中,自动关闭HTML void元素如<img>的报错问题。通过修改.eslintrc.js配置文件,调整vue/html-self-closing规则,实现正确语法检查。

环境:

vue cli 3.0初始化带有eslint项目

触发位置:

<img class="avatar" :src="photoUrl" alt="avatar" />

解决:

报错内容是:不允许对HTML void元素进行自动关闭

方法一:

<img class="avatar" :src="photoUrl" alt="avatar">

方法二:

修改文件.eslintrc.js

...
rules: {
...
	"vue/html-self-closing": ["error", {
      "html": {
        "void": "always",
        "normal": "never",
        "component": "always"
      },
      "svg": "always",
      "math": "always"
    }],
...
}
...

详情:参考链接

配置1:

{
  "vue/html-self-closing": ["error", {
    "html": {
      "void": "never",
      "normal": "always",
      "component": "always"
    },
    "svg": "always",
    "math": "always"
  }]
}

示例1:

<template>
  <!-- ✓ GOOD -->
  <div/>
  <img>
  <MyComponent/>
  <svg><path d=""/></svg>

  <!-- ✗ BAD -->
  <div></div>
  <img/>
  <MyComponent></MyComponent>
  <svg><path d=""></path></svg>
</template>

配置2:

{
  "vue/html-self-closing": ["error", {
    "html": {
      "void": "always",
      "normal": "never",
      "component": "always"
    },
    "svg": "always",
    "math": "always"
  }]
}

示例2:

<template>
  <!-- ✓ GOOD -->
  <div></div>
  <img/>
  <MyComponent/>
  <svg><path d=""/></svg>

  <!-- ✗ BAD -->
  <div/>
  <img>
  <MyComponent></MyComponent>
  <svg><path d=""></path></svg>
</template>
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> <bean id="sapInfDataSource" class="com.bs.apps.core.datasource.wrapper.DataSourceWrapper"> <property name="dataSource"> <bean class="com.bs.apps.core.datasource.wrapper.CustomDataSource" destroy-method="close"> <property name="driverClassName"><value>oracle.jdbc.driver.OracleDriver</value></property> <property name="url"><value>jdbc:oracle:thin:@10.216.109.93:1521:misdevdb</value></property> <property name="username"><value>mesinterface</value></property> <property name="password"><value>mesinterface12c</value></property> <property name="validationQuery"><value>select 1 from DUAL</value></property> </bean> </property> </bean> <bean id="sapInfSessionFactory" class="com.bs.apps.core.persistence.impl.DefaultSessionFactoryBean"> <property name="dataSource" ref="sapInfDataSource"/> <property name="mappingResources"> <list> <value>com/sap/apps/sapInterface/domain/SAPInfConfig.hbm.xml</value> </list> </property> <property name="hibernateProperties"> <props> <!-- 测试的时候HSQL的dialect --> <prop key="hibernate.dialect">com.bs.apps.core.dialect.CustOracle10gExtendedDialect</prop> <prop key="hibernate.show_sql">false</prop> <prop key="hibernate.format_sql">true</prop> <prop key="hibernate.hbm2ddl.auto">update</prop> <prop key="hibernate.query.substitutions">true 1, false 0</prop> <!-- “当前session”的范围和上下文 (scopeand context)的定义,session要绑定的上下文设置为由spring环境管理 --> <prop key="hibernate.current_session_context_class">org.springframework.orm.hibernate4.SpringSessionContext</prop> </props> </property> <!-- DB中table名字的前缀配置 --> <!-- <property name="tablePrefix"> <value>sap_</value> </property> --> </bean> <bean id="sapInfConfigService" class="com.sap.apps.sapInterface.service.impl.SAPInfConfigServiceImpl"> <property name="sessionFactory" ref="sapInfSessionFactory"/> </bean> </beans>
最新发布
08-23
<think>根据用户提供的错误信息和参考引用,我们可以确定问题出在Spring XML配置文件的根元素与DOCTYPE声明不匹配。具体来说,错误信息显示:“Document root element 'beans', must match DOCTYPE root 'null'”,这意味着XML文件中声明的根元素是“beans”,但DOCTYPE声明中期望的根元素却是“null”(即没有匹配的DOCTYPE根元素)。这通常是由于DOCTYPE声明不正确或缺失导致的。 结合参考引用[1]和[4],我们发现MyBatis的映射文件(*Mapper.xml)中如果DOCTYPE声明不正确,也会出现类似的错误。例如,引用[1]中提到,当MyBatis映射文件的DOCTYPE声明为`configuration`,但根元素写成了`mapper`时,就会报错。同样,在Spring的XML配置文件中,如果DOCTYPE声明不正确,也会导致类似问题。 ### 解决方案 #### 1. **检查并修正DOCTYPE声明** - 在Spring的XML配置文件中,通常不需要DOCTYPE声明。如果存在,请确保它正确指向Spring的DTD或Schema,并且与根元素匹配。但根据错误信息,你的DOCTYPE声明似乎为“null”,这意味着可能没有正确声明或声明无效。 - 建议:**移除DOCTYPE声明**,改用Schema声明。因为Spring官方推荐使用Schema-based配置,它更灵活且安全。 错误示例(可能导致问题的DOCTYPE): ```xml <!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN 2.0//EN" "http://www.springframework.org/dtd/spring-beans-2.0.dtd"> <beans> ... </beans> ``` 正确做法(使用Schema): ```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" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> <!-- Bean definitions here --> </beans> ``` 参考引用[3]中的示例就是正确的Schema声明方式[^3]。 #### 2. **确保根元素正确** - 根元素必须是`<beans>`,并且命名空间声明正确。检查你的XML文件,确保没有拼写错误(如`<bean>`作为根元素)或多余的标签。 #### 3. **禁用DTD解析(安全考虑)** - 为了避免潜在的XXE(XML外部实体注入)攻击,建议在解析XML时禁用DTD。在Spring中,可以通过设置解析器的属性来实现: ```java // 在创建ApplicationContext之前设置系统属性 System.setProperty("spring.xml.ignore-dtd", "true"); ``` 或者在Spring Boot的`application.properties`中设置: ```properties spring.xml.ignore-dtd=true ``` 这样,Spring将忽略DTD声明,只使用Schema进行验证。 #### 4. **验证XML文件** - 使用IDE(如IntelliJ IDEA)或XML验证工具检查XML文件的语法和结构是否正确。确保: - 根元素是`<beans>`。 - 所有命名空间声明正确且闭合。 - 没有无效的DOCTYPE声明。 #### 5. **检查配置文件路径** - 确保Spring配置文件(如`test_context_sap.xml`)位于正确的类路径下,并且在上下文初始化时能够被加载。如果文件路径错误,也会导致初始化失败。 ### 错误原因总结 - **根本原因**:XML文件中的DOCTYPE声明与根元素不匹配,或者DOCTYPE声明无效(为null)。这导致XML解析器在验证文档结构时失败。 - **触发场景**:可能是在复制其他XML文件(如MyBatis配置)时,错误地复制了DOCTYPE声明,而该声明与Spring的根元素`beans`不匹配。 ### 相关问题 1. 如何在Spring中安全地配置XML解析器以防止XXE攻击? 2. Spring XML配置中Schema和DTD的区别是什么? 3. MyBatis的Mapper文件与Spring配置文件结构有何不同? 4. 如何解决Spring Boot启动时上下文初始化失败的问题? 通过以上步骤,你应该能够解决Spring XML配置文件根元素与DOCTYPE不匹配导致的上下文初始化失败问题。如果问题仍然存在,请检查所有相关XML文件的完整性和正确性。</think>### 解决Spring XML配置文件根元素与DOCTYPE不匹配错误 根据错误信息`Document root element "beans", must match DOCTYPE root "null"`和引用内容,该问题是由于XML配置文件中的根元素`<beans>`与DOCTYPE声明不匹配导致。以下是具体解决方案: #### 核心问题分析 1. **DOCTYPE声明错误**(引用[1][4]) - 错误地将MyBatis配置文件头(`<!DOCTYPE configuration>`)复制到Spring XML文件中 - Spring XML需要匹配`beans`的DOCTYPE声明或使用Schema 2. **根元素不匹配**(引用[3]) - XML解析器期望根元素与DOCTYPE声明一致(如`configuration`或`beans`) - 实际文件中根元素为`beans`但DOCTYPE声明无效(null) #### 解决方案步骤 ##### 1. 修正XML文件头(关键步骤) **错误配置示例**(引用[1][4]): ```xml <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd"> <beans> <!-- bean定义 --> </beans> ``` **正确配置**(引用[3]): ```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:tx="http://www.springframework.org/schema/tx" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd"> <bean id="testBean" class="com.example.TestBean"/> </beans> ``` ##### 2. 移除或替换DOCTYPE声明 - **方案A(推荐)**:完全移除DOCTYPE声明,改用Schema - **方案B**:使用正确的Spring DTD声明(不推荐) ```xml <!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN 2.0//EN" "http://www.springframework.org/dtd/spring-beans-2.0.dtd"> ``` ##### 3. 验证XML结构 确保: - 根元素必须是`<beans>`(大小写敏感) - 所有命名空间声明正确闭合 - Schema URL可访问(或使用本地Schema副本) ##### 4. 检查配置文件加载路径(引用[2]) 在Spring Boot配置中确认路径正确: ```yaml # application.yml spring: config: import: classpath:com/sap/apps/sapInterface/test_context_sap.xml ``` #### 安全建议 ```java // 在初始化代码中禁用DTD防止XXE攻击 @Bean public static BeanFactoryPostProcessor xmlProcessor() { return factory -> { XmlBeanDefinitionReader reader = new XmlBeanDefinitionReader(...); reader.setDocumentReaderClass(SafeXmlReader.class); // 自定义安全解析器 }; } // SafeXmlReader.java public class SafeXmlReader extends DefaultBeanDefinitionDocumentReader { protected void doRegisterBeanDefinitions(Element root) { // 禁用DTD reader.setFeature("http://apache.org/xml/features/disallow-doctype-decl", true); } } ``` #### 相关问题 1. 如何解决MyBatis Mapper文件中的"根元素mapper必须匹配DOCTYPE配置"错误?[^1][^4] 2. Spring Boot中如何正确配置XML和注解混合的Bean定义?[^3] 3. 如何防止XML配置文件解析时的XXE安全漏洞?[^1] 4. MyBatis Plus的mapper-locations配置有哪些最佳实践?[^2] > 通过上述修正,Spring应能正确解析XML配置文件。如果仍有问题,请检查项目依赖的Spring版本是否与XML Schema版本匹配(如Spring 5使用spring-beans-5.x.xsd)[^3]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值