Spring Boot Starter中@Converter(autoApply=true)未自动生效问题
Spring Boot Starter中@Converter(autoApply=true)不自动生效的原因分析
JPA转换器注册时机与类加载顺序不匹配:JPA的PersistenceUnit初始化流程会优先扫描当前项目类路径下的转换器,而Starter中的转换器是通过自动配置类导入的,其加载时机晚于JPA的初始化步骤。当JPA扫描并注册autoApply类型的转换器时,Starter里的转换器还未被Spring容器纳入管理,因此无法被自动应用。而将转换器直接放在业务项目中时,会被项目自身的组件扫描提前发现,在JPA初始化阶段就完成了注册,
autoApply=true自然生效。组件扫描范围未覆盖Starter包路径:业务项目默认的
@ComponentScan通常仅扫描自身项目的包路径,JPA的转换器扫描机制默认也只关注当前PersistenceUnit所在的类路径范围。Starter中的转换器即便通过自动配置类导入,若不在JPA的扫描范围内,其autoApply=true的标记不会被JPA识别,只能通过实体字段上的@Convert注解显式触发转换。自动配置类生效滞后于EntityManagerFactory初始化:虽然将转换器配置到了
AutoConfiguration.imports中,但如果自动配置类的加载顺序晚于EntityManagerFactory的初始化,那么转换器是在JPA完成所有转换器注册之后才被加入Spring容器的。此时JPA不会重新扫描并应用autoApply类型的转换器,导致必须显式添加@Convert注解才能生效。
内容的提问来源于stack exchange,提问作者Brian Siim Andersen
相关产品推荐
相关产品推荐

