起因是bean的一些初始化方法里面,查询数据的时话,用到了Spring的一些Bean,采用的是静态调用。而这些bean还没有被始始化出来。导致空指针异常。需要提前把这部份bean创建好。虽然下面提出的解决方法能解决该问题。但仍然是不推荐的调用。不符合Spring正常的注入规则。而且此处没法用Depends之类的来处理
在某个InitializingBean的初始化方法中,调用了如下静态方法,导致不能正确的获取到SecretWrapperEnhancer对象,改造后如下:
@Overridepublic void afterPropertiesSet() {...//间接调用了SecretWrapperEnhancers.enhanceSecretWrapper...}publi
c class SecretWrapperEnhancers {private static List<SecretWrapperEnhancer> enhancers;public static void setEnhancers(List<SecretWrapperEnhancer> enhancers) {SecretWrapperEnhancers.enhancers = enhancers;}public static void enhanceSecretWrapper(SecretWrapper secretWrapper) {if (ZYListUtils.isEmptyList(enhancers)) {return;}// 旧有做法得到的是空的: List<SecretWrapperEnhancer> enhancers=SpringContextHolder.getBeans(SecretWrapperEnhancer.class);for (SecretWrapperEnhancer enhancer : enhancers) {if (enhancer.supportClass(secretWrapper.getModelClass())) {List<SecretModel> secretModels = enhancer.loadEnhanceModel(secretWrapper);secretWrapper.enhance(secretModels);}}}
}
只需要在postProcessBeanFactory中提前获取bean并设置即可,将bean的构建提到靠前的位置
public class PrepareCompleteAboutBeanProcessor implements BeanFactoryPostProcessor {@Overridepublic void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {Map<String, SecretWrapperEnhancer> beansOfType = beanFactory.getBeansOfType(SecretWrapperEnhancer.class);Collection<SecretWrapperEnhancer> values = beansOfType.values();SecretWrapperEnhancers.setEnhancers(new ArrayList<>(values));}
}