遇到问题
自己封装的stater,在改完代码后,网关跑不起来了。
改动点是@ComponentScan从xx.xx.core.utils改成xx.xx.**,因为当时要加一个xx.xx.core.uid,索性就把utils去掉了,改成通配。
结果网关跑起来后,报了个有两个object mapper的错。
定位问题
定位了一下代码,确实自定义了一个object mapper,上代码
1 |
|
包扫描改了后,扫到这个类了?但是为什么不扫到这个类的时候,可以跑?
猜想
报错,肯定生成了两个object mapper,那就意味着AutoConfigureBefore失效了。
把代码回滚后,重新跑了下,验证了AutoConfigureBefore确实是生效了,那这个时候明确了,就是AutoConfigureBefore失效了。
改个包扫描,为什么AutoConfigureBefore会失效?
查文档
查了下spring boot老的文档,找到功能页,搜索AutoConfigureBefore,看到一行关键文档。
开始翻译
Auto-configurations must be loaded that way only(自动装配类,必须由spring.factories提供,that就是上文的spring.factories)。
Make sure that they are defined in a specific package space and that they are never the target of component
scanning(让你别扫到它,好吧。。)
Furthermore, auto-configuration classes should not enable component scanning to find additional components. Specific
@Imports should be used instead.(要用一些bean,用import。)
结论
由此推断扫描的优先级要大于自动配置的类(直接生成了object mapper,并没有等jackson自动配置前)
只有自动配置的类才能生效AutoConfigureBefore,AutoConfigureAfter和AutoConfigureOrder应该也是(不扫到就能跑)
代码就不看了,太忙了。