在使用SpringBoot与MyBatis整合时,遇到了如下异常信息:
Caused by: org.springframework.beans.factory.BeanDefinitionStoreException: Invalid bean definition with name 'deptMapper' defined in file [F:\JavaWed\Java_Maven_Prejoct\tlias-managerment\target\classes\com\cainiao\mapper\DeptMapper.class]: Invalid value type for attribute 'factoryBeanObjectType': java.lang.String
导致这个原因是:
-
安全策略:现代的应用服务器和运行环境(如Spring Boot)可能配置了更严格的安全策略,阻止通过非安全连接(HTTP)加载外部资源。这是为了防止中间人攻击和其他安全问题。因此,当尝试通过HTTP协议加载DTD文件时,可能会被拦截或拒绝。
-
SSL/TLS支持:一些应用服务器默认启用了SSL/TLS检查,并且只允许通过HTTPS加载外部资源。如果DTD文件是通过HTTP提供的,那么它将不会被加载,从而导致解析错误。
-
内容类型转换错误:当你看到“类型转换错误”时,这可能是由于DTD文件没有被正确下载或解析,导致XML映射文件中的元素无法被正确识别。这可能是因为服务器返回了一个错误的状态码或者一个不正确的MIME类型,而不是DTD本身的内容。
-
网络代理/防火墙:某些企业级网络环境中可能存在网络代理或防火墙设置,它们会阻止或修改HTTP请求。这种情况下,即使是有效的URL也可能无法访问到DTD文件。
-
缓存问题:有时候浏览器或应用服务器的缓存机制可能导致过期或损坏的DTD文件被使用,从而引起解析错误。
解决方案:
这是我们在Mybatis官网中复制的XML 映射文件的配置信息
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
此异常表明在解析DeptMapper
类文件定义的bean时出现了类型不匹配的问题,具体是factoryBeanObjectType
属性值无效。
经过排查发现,该问题是由于MyBatis映射器XML配置文件中的DOCTYPE声明引用了HTTP协议的DTD(文档类型定义)资源链接,导致Spring框架无法正确解析该XML文件。
Caused by: org.springframework.beans.factory.BeanDefinitionStoreException: Invalid bean definition with name 'deptMapper' defined in file [F:\JavaWed\Java_Maven_Prejoct\tlias-managerment\target\classes\com\cainiao\mapper\DeptMapper.class]: Invalid value type for attribute 'factoryBeanObjectType': java.lang.String
我们这是只需要把配置把文件中http改成https就解决了
下面是修改后的配置信息:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"https://mybatis.org/dtd/mybatis-3-mapper.dtd">
为了解决这个问题,建议修改XML配置文件中对DTD的引用方式,将原来的HTTP链接替换为HTTPS链接。这不仅遵循了现代网络的安全实践,同时也能够解决因HTTP连接可能引起的兼容性或安全性问题。
备注: 尽管有时即便是在首次使用HTTPS加载后再次尝试通过HTTP加载不会立即报错,但为了确保长期稳定性和安全性,强烈推荐始终采用HTTPS协议来访问外部资源。