org.springframework.beans.factory.xml.XmlBeanDefinitionStoreException:字节的 UTF-8 序列的字节 1 无效

在进行Spring与Mybatis整合测试时遇到错误:'org.springframework.beans.factory.xml.XmlBeanDefinitionStoreException: 字节的 UTF-8 序列的字节 1 无效'。错误定位到spring-dao.xml配置文件第14行第19列,提示为中文解码问题。解决方案包括将配置文件的encoding从UTF-8改为GBK,或者移除含有中文的注释。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

spring-mybatis整合 测试时报错:

D:\jdk-12.0.2_windows-x64_bin\jdk-12.0.2\bin\java.exe -ea -Didea.test.cyclic.buffer.size=1048576 "-javaagent:D:\IDEA\idea2020.1\IntelliJ IDEA 2020.1\lib\idea_rt.jar=60868:D:\IDEA\idea2020.1\IntelliJ IDEA 2020.1\bin" -Dfile.encoding=UTF-8 -classpath "D:\IDEA\idea2020.1\IntelliJ IDEA 2020.1\lib\idea_rt.jar;D:\IDEA\idea2020.1\IntelliJ IDEA 2020.1\plugins\junit\lib\junit5-rt.jar;D:\IDEA\idea2020.1\IntelliJ IDEA 2020.1\plugins\junit\lib\junit-rt.jar;E:\doc\spring\spring-10-mybatis\target\test-classes;E:\doc\spring\spring-10-mybatis\target\classes;D:\maven\apache-maven-3.6.3\repository\junit\junit\4.13.1\junit-4.13.1.jar;D:\maven\apache-maven-3.6.3\repository\org\hamcrest\hamcrest-core\1.3\hamcrest-core-1.3.jar;D:\maven\apache-maven-3.6.3\repository\mysql\mysql-connector-java\8.0.23\mysql-connector-java-8.0.23.jar;D:\maven\apache-maven-3.6.3\repository\com\google\protobuf\protobuf-java\3.11.4\protobuf-java-3.11.4.jar;D:\maven\apache-maven-3.6.3\repository\org\mybatis\mybatis\3.5.6\mybatis-3.5.6.jar;D:\maven\apache-maven-3.6.3\repository\org\springframework\spring-webmvc\5.2.2.RELEASE\spring-webmvc-5.2.2.RELEASE.jar;D:\maven\apache-maven-3.6.3\repository\org\springframework\spring-aop\5.2.2.RELEASE\spring-aop-5.2.2.RELEASE.jar;D:\maven\apache-maven-3.6.3\repository\org\springframework\spring-beans\5.2.2.RELEASE\spring-beans-5.2.2.RELEASE.jar;D:\maven\apache-maven-3.6.3\repository\org\springframework\spring-context\5.2.2.RELEASE\spring-context-5.2.2.RELEASE.jar;D:\maven\apache-maven-3.6.3\repository\org\springframework\spring-core\5.2.2.RELEASE\spring-core-5.2.2.RELEASE.jar;D:\maven\apache-maven-3.6.3\repository\org\springframework\spring-jcl\5.2.2.RELEASE\spring-jcl-5.2.2.RELEASE.jar;D:\maven\apache-maven-3.6.3\repository\org\springframework\spring-expression\5.2.2.RELEASE\spring-expression-5.2.2.RELEASE.jar;D:\maven\apache-maven-3.6.3\repository\org\springframework\spring-web\5.2.2.RELEASE\spring-web-5.2.2.RELEASE.jar;D:\maven\apache-maven-3.6.3\repository\org\springframework\spring-jdbc\5.2.2.RELEASE\spring-jdbc-5.2.2.RELEASE.jar;D:\maven\apache-maven-3.6.3\repository\org\springframework\spring-tx\5.2.2.RELEASE\spring-tx-5.2.2.RELEASE.jar;D:\maven\apache-maven-3.6.3\repository\org\aspectj\aspectjweaver\1.9.4\aspectjweaver-1.9.4.jar;D:\maven\apache-maven-3.6.3\repository\org\mybatis\mybatis-spring\2.0.6\mybatis-spring-2.0.6.jar;D:\maven\apache-maven-3.6.3\repository\org\projectlombok\lombok\1.18.10\lombok-1.18.10.jar" com.intellij.rt.junit.JUnitStarter -ideVersion5 -junit4 MyTest,spring_mybatis

org.springframework.beans.factory.xml.XmlBeanDefinitionStoreException: Line 14 in XML document from class path resource [spring-dao.xml] is invalid; nested exception is org.xml.sax.SAXParseException; lineNumber: 14; columnNumber: 19; 1 字节的 UTF-8 序列的字节 1 无效。

	at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.doLoadBeanDefinitions(XmlBeanDefinitionReader.java:405)
	at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.loadBeanDefinitions(XmlBeanDefinitionReader.java:337)
	at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.loadBeanDefinitions(XmlBeanDefinitionReader.java:305)
	at org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:188)
	at org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:224)
	at org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:195)
	at org.springframework.beans.
### 在 Spring Boot 项目中将 MultipartFile 对象存储到缓存中的实现方式 为了在 Spring Boot 项目中将 `MultipartFile` 对象存储到缓存中,可以结合 Spring Cache 抽象层和缓存管理器(如 Redis 或 EhCache)来实现。以下是详细的实现方法: #### 配置缓存管理器 首先需要在项目中引入适当的缓存依赖。例如,使用 Redis 作为缓存存储时,可以在 `pom.xml` 中添加以下依赖: ```xml <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-cache</artifactId> </dependency> ``` 接着,在 `application.properties` 文件中配置 Redis 相关参数: ```properties spring.cache.type=redis spring.redis.host=localhost spring.redis.port=6379 ``` #### 缓存 MultipartFile 对象 由于 `MultipartFile` 是一个接口,其实现类可能包含流数据,而流数据通常不能直接序列化并存储到缓存中。因此,可以将文件内容转换为字节数组后再进行缓存。 以下是一个示例代码,展示如何将 `MultipartFile` 转换为字节数组并存储到缓存中: ```java import org.springframework.beans.factory.annotation.Autowired; import org.springframework.cache.annotation.Cacheable; import org.springframework.stereotype.Service; import java.io.IOException; @Service public class FileCacheService { @Autowired private CacheManager cacheManager; public void cacheFile(String key, MultipartFile file) { try { byte[] fileBytes = file.getBytes(); // 将文件转换为字节数组 cacheManager.getCache("fileCache").put(key, fileBytes); // 将字节数组存储到缓存中 } catch (IOException e) { throw new RuntimeException("Failed to cache file", e); } } @Cacheable(value = "fileCache", key = "#key") public byte[] getFileFromCache(String key) { return null; // 方法会被缓存代理拦截,实际逻辑无需实现 } } ``` #### 处理文件上传与缓存逻辑 在处理文件上传时,可以通过控制器接收 `MultipartFile` 参数,并调用上述服务将其存储到缓存中: ```java import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; @RestController public class FileUploadController { @Autowired private FileCacheService fileCacheService; @PostMapping("/upload") public String uploadFile(@RequestParam("file") MultipartFile file) { if (!file.isEmpty()) { String cacheKey = "file_" + System.currentTimeMillis(); fileCacheService.cacheFile(cacheKey, file); // 将文件存储到缓存中 return "File uploaded and cached with key: " + cacheKey; } return "File is empty"; } } ``` #### 从缓存中读取文件 当需要从缓存中读取文件时,可以通过 `FileCacheService` 提供的方法获取字节数组,并将其转换回文件对象: ```java import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.io.OutputStream; @RestController public class FileDownloadController { @Autowired private FileCacheService fileCacheService; @GetMapping("/download") public void downloadFile(@RequestParam("key") String key, HttpServletResponse response) throws IOException { byte[] fileBytes = fileCacheService.getFileFromCache(key); // 从缓存中获取文件字节数组 if (fileBytes != null) { response.setContentType("application/octet-stream"); response.setContentLength(fileBytes.length); response.setHeader("Content-Disposition", "attachment; filename=file_from_cache"); OutputStream outputStream = response.getOutputStream(); outputStream.write(fileBytes); outputStream.flush(); outputStream.close(); } else { response.sendError(HttpServletResponse.SC_NOT_FOUND, "File not found in cache"); } } } ``` --- ### 注意事项 1. 缓存中的文件数据可能会过期或被清除,因此需要合理设置缓存的过期时间。 2. 如果文件较大,建议使用分块上传和分布式存储方案,而不是直接将文件内容存储到缓存中[^1]。 3. 在高并发场景下,应考虑缓存一致性问题以及 Redis 的性能优化[^2]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

m78探索者

谢谢

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值