场景:
dubbo客户端调用服务端的时候使用自定义的代理tccJavassist。我在生成动态方法的地方,增加拦截器。
期望在调用该代理方法的时候,两个拦截器能生效。代码效果如同在方法中增加注解:@Aop({"compensableTransactionForNutzInterceptor","resourceCoordinatorForNutzInterceptor"})
Annotation nutzAopAnnot = new Annotation("org.nutz.ioc.aop.Aop", constpool);
ArrayMemberValue listenerArray = new ArrayMemberValue(constpool);
StringMemberValue stringMemberValue1 = new StringMemberValue("compensableTransactionForNutzInterceptor",constpool);
StringMemberValue stringMemberValue2 = new StringMemberValue("resourceCoordinatorForNutzInterceptor",constpool);
MemberValue[] members = new MemberValue[2];
members[0] = stringMemberValue1;
members[1] = stringMemberValue2;
listenerArray.setValue(members);
nutzAopAnnot.addMemberValue("value", listenerArray);
attr.addAnnotation(nutzAopAnnot);
实际上调用该方法并没有调用该拦截器。
仔细捋了一下:
dubbo调用远程客户端,是使用懒加载的方式。实际上javassist的这段代码是在远程调用的时候才执行。nutz容器和扫描早就结束。可能无法生效。
有没有办法能在该方法动态加入拦截器?
tcc-transaction 是利用spring aop:
dubbo在启动的时候会生成客户端的引用,并把它放到容器,因为tcc-transaction能正常执行拦截器。
附上生成的代理类:
public class proxy2
implements TccClassGenerator.DC, EchoService, CapitalTradeOrderService
{
public static Method[] methods;
private InvocationHandler handler;
@Aop({"compensableTransactionForNutzInterceptor", "resourceCoordinatorForNutzInterceptor"})
@Compensable(propagation=Propagation.SUPPORTS, confirmMethod="record", cancelMethod="record", transactionContextEditor=DubboTransactionContextEditor.class)
public String record(CapitalTradeOrderDto paramCapitalTradeOrderDto)
{
Object[] arrayOfObject = new Object[1];
arrayOfObject[0] = paramCapitalTradeOrderDto;
Object localObject = this.jdField_handler_of_type_JavaLangReflectInvocationHandler.invoke(this, jdField_methods_of_type_ArrayOfJavaLangReflectMethod[0], arrayOfObject);
return (String)localObject;
}
public Object $echo(Object paramObject)
{
Object[] arrayOfObject = new Object[1];
arrayOfObject[0] = paramObject;
Object localObject = this.jdField_handler_of_type_JavaLangReflectInvocationHandler.invoke(this, jdField_methods_of_type_ArrayOfJavaLangReflectMethod[1], arrayOfObject);
return (Object)localObject;
}
public proxy2()
{
}
public proxy2(InvocationHandler paramInvocationHandler)
{
this.jdField_handler_of_type_JavaLangReflectInvocationHandler = paramInvocationHandler;
}
}
问题:
有什么办法能让方法动态地加入nutz的拦截器?