Adding interceptor at runtime / dynamically
alesj Feb 5, 2011 2:06 PMI'm trying to add EJB' AOP intreceptor for Weld, in some deployer.
Should this work? Or when does EJB container assemble its AOP interceptors?
As I tried debugging, but the interceptor is never hit.
This is the test: https://github.com/alesj/core/compare/weld-848
public class WeldEjbLifecycleInterceptorDeployer extends WeldAwareMetadataDeployer<JBossMetaData> { private Boolean done; public WeldEjbLifecycleInterceptorDeployer() { super(JBossMetaData.class, false); setStage(DeploymentStages.PRE_REAL); } @Override protected void internalDeploy(VFSDeploymentUnit unit, JBossMetaData jbmd, Collection<VirtualFile> wbXml) throws DeploymentException { if (done != null) return; try { AspectDefinition def = new AspectDefinition("weld-aspect", Scope.PER_INSTANCE, new GenericAspectFactory(WeldLifecycleInterceptor.class.getName(), null)); AdviceFactory advice = new AdviceFactory(def, "invoke"); PointcutExpression pointcut = new PointcutExpression("weld-pointcut", "execution(* @" + PostActivate.class.getName() + "->*(..)) OR execution(* @" + PrePassivate.class.getName() + "->*(..))"); InterceptorFactory[] interceptors = {advice}; AdviceBinding binding = new AdviceBinding("weld-binding", pointcut, null, null, interceptors); AspectManager manager = AspectManager.getTopLevelAspectManager(); DomainDefinition dd = manager.getContainer("Intercepted Bean"); AspectManager domain = dd.getManager(); domain.addAspectDefinition(def); domain.addInterceptorFactory(advice.getName(), advice); domain.addPointcut(pointcut); domain.addBinding(binding); done = true; } catch (Exception e) { done = false; throw DeploymentException.rethrowAsDeploymentException("Error setting Weld lifecycle interceptor", e); } } public static class WeldLifecycleInterceptor extends SessionBeanInterceptor implements Interceptor { public String getName() { return WeldLifecycleInterceptor.class.getName(); } public Object invoke(final Invocation invocation) throws Throwable { return aroundInvoke(new InvocationContext() { public Object getTarget() { return invocation.getTargetObject(); } public Method getMethod() { return null; } public Object[] getParameters() { return new Object[0]; } public void setParameters(Object[] params) { } public Map<String, Object> getContextData() { return Collections.emptyMap(); } public Object getTimer() { return null; } public Object proceed() throws Exception { try { return invocation.invokeNext(); } catch (Throwable t) { throw new Exception(t); } } }); } } }