java - Spring 多个 : crash early 类型的 bean

标签 java spring autowired

当我在 Spring Web 应用程序中加载网页时,出现以下错误:

java.lang.IllegalStateException: More than one bean of type [com.Car] found, you have to specify the name of the bean

如何强制 Spring 在启动时检测此问题?

请注意,我知道如何自行解决问题(例如删除两个定义之一) 我只是想确保在打开每个网页之前没有找不到其他情况。

最佳答案

创建一个 BeanPostProcessor,它跟踪为应用程序上下文中的每个 bean 定义创建的实例数量。这将为您想要限制的 bean 类型引发异常,并停止容器初始化。因此您可以更早地检测到错误

    public class DuplicateBeanDetectionBeanPostProcessor implements BeanPostProcessor{

    private Map<Class<?> , Boolean> beanTypeFound = new HashMap<Class<?> , Boolean>();

    private Set<Class<?> typesToRestrictToOneInstance = new HashSet<Class<?>>();

    public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException{
    return bean;
    }

    public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException{
    Set<Class<?>> restrictedTypesForBean = findRestrictedTypesForInstance(bean);
    if(!restrictedTypeForBean.isEmpty() && typeAlreadyFound(bean , restrictedTypesForBean)){
       throw new IllegalStateException("Bean of type : " + restrictedTypeForBean + " already found in the application context";
    }
    return bean;
    }

    private Set<Class<?>> findRestrictedTypesForInstance(Object bean){
      Set<Class<?>> restrictedTypesForBean = hew HashSet<>();
      Class<?> superClass = bean.getClass();
    while(superClass != null){
       for(Class<?> restrictedType : typesToRestrictToOneInstance){
          if(restrictedType.isAssignableFrom(superClass){
               restrictedTypesForBean.add(restrictedType);
          }
       }
    }
    return restrictedTypesForBean;
    }

    private boolean typeAlreadyFound(Object bean , Set<Class<?>> restrictedTypesForBean){
    for(Class<?> restrictedTypeForBean : restrictedTypesForBean){
        if(beanTypeFound.get(restrictedTypeForBean)){
            return true;
        }
        else{
           beanTypeFound.set(restrictedTypeForBean , true);
        }
    }
    return false;
    }

    public void setTypesToRestrictToOneInstance(Set<Class<?>> typesToRestrictToOneInstance){
   this.typesToRestrictToOneInstance = typesToRestrictToOneInstance;
}
}

通过适合您的配置机制的方式将 BeanPostProcessor 添加到您的应用程序上下文中。然后设置所有要限制的类型

关于java - Spring 多个 : crash early 类型的 bean,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37003726/

相关文章:

java - 关于 eclipse 中的 java map

java - 第一行的 "/"字符使用 JasperReports 删除所有文本

java - Eclipse中从一种方法跳转到另一种方法的快捷方式

java - 注入(inject) stub 服务代替 Autowiring 的 bean 进行单元测试

java - 计算 10 以下的数字并打印每一个

java - JPA 更改不会保留在数据库中

java - Spring 测试/生产应用程序上下文

java - JQuery 更新 <c :forEach> in Spring MVC

symfony - 如何更改某些 Controller 的 Monolog channel Symfony 3.4 或 4+

java.lang.IllegalArgumentException : Cannot set to com. sun.proxy.$代理