diff --git a/impl/src/main/java/org/jboss/weld/bootstrap/AbstractBeanDeployer.java b/impl/src/main/java/org/jboss/weld/bootstrap/AbstractBeanDeployer.java index c4803f8d645..62acf4b19e8 100644 --- a/impl/src/main/java/org/jboss/weld/bootstrap/AbstractBeanDeployer.java +++ b/impl/src/main/java/org/jboss/weld/bootstrap/AbstractBeanDeployer.java @@ -138,7 +138,7 @@ public AbstractBeanDeployer deploy() { for (ObserverMethodImpl observer : getEnvironment().getObservers()) { Bean ob = observer.getDeclaringBean(); // make sure we're not specialized - if (manager.getSpecializedBeans().containsKey(ob) == false) { + if (Beans.isSpecialized(ob, manager) == false) { log.debug(FOUND_OBSERVER_METHOD, observer); observer.initialize(); ProcessObserverMethodImpl.fire(manager, observer); diff --git a/impl/src/main/java/org/jboss/weld/util/Beans.java b/impl/src/main/java/org/jboss/weld/util/Beans.java index a6affba0c4f..194b8beb677 100644 --- a/impl/src/main/java/org/jboss/weld/util/Beans.java +++ b/impl/src/main/java/org/jboss/weld/util/Beans.java @@ -60,6 +60,7 @@ import javax.annotation.PreDestroy; import javax.decorator.Decorator; import javax.enterprise.context.Dependent; +import javax.enterprise.context.spi.Contextual; import javax.enterprise.context.spi.CreationalContext; import javax.enterprise.event.Observes; import javax.enterprise.inject.Alternative; @@ -558,18 +559,37 @@ public static boolean isAlternative(WeldAnnotated annotated, MergedStereot /** * Check if bean is specialized by any of beans * - * @param bean - * @param beans - * @param allSpecializedBeans - * @return + * @param bean the bean to check + * @param beanManager bean manager + * @return true if bean is specialized by some bean in all beans */ - public static > boolean isSpecialized(T bean, Set beans, BeanManagerImpl beanManager) { + public static > boolean isSpecialized(T bean, BeanManagerImpl beanManager) { for (Iterable beanManagers : BeanManagers.getAccessibleClosure(beanManager)) { for (BeanManagerImpl accessibleBeanManager : beanManagers) { if (accessibleBeanManager.getSpecializedBeans().containsKey(bean)) { - if (beans.contains(accessibleBeanManager.getSpecializedBeans().get(bean))) { - return true; - } + return true; + } + } + } + return false; + } + + /** + * Check if bean is specialized by any of beans + * + * @param bean the bean to check + * @param beans the possible specialized beans + * @param beanManager bean manager + * @return true if bean is specialized by some bean in beans + */ + public static > boolean isSpecialized(T bean, Set beans, BeanManagerImpl beanManager) { + for (Iterable beanManagers : BeanManagers.getAccessibleClosure(beanManager)) { + for (BeanManagerImpl accessibleBeanManager : beanManagers) { + Map, Contextual> specializedBeans = accessibleBeanManager.getSpecializedBeans(); + Contextual specializedBean = specializedBeans.get(bean); + //noinspection SuspiciousMethodCalls + if (specializedBean != null && beans.contains(specializedBean)) { + return true; } } }