Index: src/main/java/org/glassfish/weld/BeanDeploymentArchiveImpl.java =================================================================== --- src/main/java/org/glassfish/weld/BeanDeploymentArchiveImpl.java (revision 51855) +++ src/main/java/org/glassfish/weld/BeanDeploymentArchiveImpl.java (working copy) @@ -81,6 +81,7 @@ import org.glassfish.api.deployment.archive.ReadableArchive; import org.glassfish.weld.WeldUtils.BDAType; import org.glassfish.weld.ejb.EjbDescriptorImpl; +import org.glassfish.weld.services.ProxyServicesImpl; import org.jboss.weld.bootstrap.WeldBootstrap; import org.jboss.weld.bootstrap.api.ServiceRegistry; import org.jboss.weld.bootstrap.api.helpers.SimpleServiceRegistry; @@ -116,6 +117,7 @@ private ClassLoader moduleClassLoaderForBDA = null; private String friendlyId = ""; + private boolean proxyServicesRegistrationGuard; /** @@ -559,4 +561,26 @@ itMap.put(annotatedType, it); } + void registerInProxyServices(ProxyServicesImpl proxyServices) { + if (proxyServicesRegistrationGuard) { + return; + } + + proxyServicesRegistrationGuard = true; + try { + ClassLoader classLoader = getClassLoader(); + for (Class beanClass : beanClasses) { + proxyServices.registerClassLoaderForClass(beanClass, classLoader); + } + for (BeanDeploymentArchive archive : beanDeploymentArchives) { + if (archive instanceof BeanDeploymentArchiveImpl) { + BeanDeploymentArchiveImpl archiveImpl = (BeanDeploymentArchiveImpl)archive; + archiveImpl.registerInProxyServices(proxyServices); + } + } + } + finally { + proxyServicesRegistrationGuard = false; + } + } } Index: src/main/java/org/glassfish/weld/services/ProxyServicesImpl.java =================================================================== --- src/main/java/org/glassfish/weld/services/ProxyServicesImpl.java (revision 51855) +++ src/main/java/org/glassfish/weld/services/ProxyServicesImpl.java (working copy) @@ -43,6 +43,8 @@ import java.security.AccessController; import java.security.PrivilegedAction; import java.security.PrivilegedExceptionAction; +import java.util.Map; +import java.util.TreeMap; import org.jboss.weld.serialization.spi.ProxyServices; @@ -69,9 +71,16 @@ * @author Sivakumar Thyagarajan */ public class ProxyServicesImpl implements ProxyServices { + private final Map registeredClassLoaders = new TreeMap(); @Override public ClassLoader getClassLoader(final Class proxiedBeanType) { + String className = proxiedBeanType.getName(); + ClassLoader classLoader = registeredClassLoaders.get(className); + if (classLoader != null) { + return classLoader; + } + SecurityManager sm = System.getSecurityManager(); if (sm != null) { return AccessController @@ -117,4 +126,7 @@ // nothing to cleanup in this implementation. } -} \ No newline at end of file + public void registerClassLoaderForClass(Class cls, ClassLoader classLoader) { + registeredClassLoaders.put(cls.getName(), classLoader); + } +} Index: src/main/java/org/glassfish/weld/WeldDeployer.java =================================================================== --- src/main/java/org/glassfish/weld/WeldDeployer.java (revision 51855) +++ src/main/java/org/glassfish/weld/WeldDeployer.java (working copy) @@ -40,6 +40,7 @@ package org.glassfish.weld; +import java.lang.reflect.Field; import java.util.Collection; import java.util.HashMap; import java.util.HashSet; @@ -73,6 +74,7 @@ import org.glassfish.weld.services.SecurityServicesImpl; import org.glassfish.weld.services.TransactionServicesImpl; import org.glassfish.weld.services.ValidationServicesImpl; +import org.jboss.weld.bootstrap.BeanDeployment; import org.jboss.weld.bootstrap.WeldBootstrap; import org.jboss.weld.bootstrap.api.Environments; import org.jboss.weld.bootstrap.spi.BeanDeploymentArchive; @@ -167,6 +169,8 @@ bootstrap.startContainer(Environments.SERVLET, deploymentImpl/*, new ConcurrentHashMapBeanStore()*/); bootstrap.startInitialization(); fireProcessInjectionTargetEvents(bootstrap, deploymentImpl); + ProxyServicesImpl proxyServices = (ProxyServicesImpl)deploymentImpl.getServices().get(ProxyServices.class); + registerClassLoadersForBeans(bootstrap, proxyServices); bootstrap.deployBeans(); } catch (Throwable t) { DeploymentException de = new DeploymentException(t.getMessage()); @@ -464,6 +468,21 @@ } return ejbBundle; } + + private static void registerClassLoadersForBeans(WeldBootstrap bootstrap, + ProxyServicesImpl proxyServices) + throws IllegalAccessException, NoSuchFieldException { + Field beanDeploymentsField = WeldBootstrap.class.getDeclaredField("beanDeployments"); + beanDeploymentsField.setAccessible(true); + @SuppressWarnings("unchecked") Map beanDeployments = + (Map)beanDeploymentsField.get(bootstrap); + for (BeanDeploymentArchive archive : beanDeployments.keySet()) { + if (archive instanceof BeanDeploymentArchiveImpl) { + BeanDeploymentArchiveImpl archiveImpl = (BeanDeploymentArchiveImpl)archive; + archiveImpl.registerInProxyServices(proxyServices); + } + } + } }