Java 我的Google Guice方法拦截器不';我不能执行,但为什么?
所以我正在测试一个简单的Google Guice拦截器- 我的注释-Java 我的Google Guice方法拦截器不';我不能执行,但为什么?,java,dependency-injection,guice,Java,Dependency Injection,Guice,所以我正在测试一个简单的Google Guice拦截器- 我的注释- @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.METHOD) public @interface AppOpsOperation { } 我的拦截器 public class AppOpsOperationDecorator implements MethodInterceptor { private ServiceCallStack callSt
@Retention(RetentionPolicy.RUNTIME) @Target(ElementType.METHOD)
public @interface AppOpsOperation {
}
我的拦截器
public class AppOpsOperationDecorator implements MethodInterceptor {
private ServiceCallStack callStack = null ;
@Inject
public void setServiceCallStack(ServiceCallStack stack ){
callStack = stack ;
}
@Override
public Object invoke(MethodInvocation arg0) throws Throwable {
// Retrieve the call stack
// exclude service population if caller service is the same service
// else push the current service onto top of stack
System.out.println("Intercepting method -- :: " + arg0.getMethod().getName());
System.out.println("On object - :: " + arg0.getThis().getClass().getName());
System.out.println("On accessible object - :: " + arg0.getStaticPart().getClass().getName());
return invocation.proceed();
}
}
现在是我的服务接口和方法
public interface MockCalledService extends AppOpsService {
@AppOpsOperation
public String methodOneCalled(String some);
@AppOpsOperation
public String methodTwoCalled(String some);
}
public class MockCalledServiceImpl extends BaseAppOpsService implements MockCalledService {
@Override
@AppOpsOperation
public String methodOneCalled(String some) {
System.out.println("MockCalledServiceImpl.methodOneCalled()");
return this.getClass().getCanonicalName() + "methodOneCalled";
}
@Override
public String methodTwoCalled(String some) {
System.out.println("MockCalledServiceImpl.methodTwoCalled()");
return this.getClass().getCanonicalName() + "methodTwoCalled";
}
}
和我的Guice测试模块
public class MockTestGuiceModule extends AbstractModule {
@Override
protected void configure() {
bind(ServiceCallStack.class).toInstance(new ServiceCallStack());
AppOpsOperationDecorator decorator = new AppOpsOperationDecorator() ;
requestInjection(decorator);
bindInterceptor(Matchers.any(), Matchers.annotatedWith(AppOpsOperation.class),
decorator);
bind(MockCalledService.class).toInstance(new MockCalledServiceImpl());
}
}
当我运行下面的测试时,此拦截器不会执行-
public class AppOpsOperationDecoratorTest {
private Injector injector = null ;
@Before
public void init(){
injector = Guice.createInjector(new MockTestGuiceModule());
}
@Test
public void testDecoratorInvocation() {
MockCalledService called = injector.getInstance(MockCalledService.class);
called.methodOneCalled("Test String");
}
}
你能强调一下我做错了什么吗?我在找到真正的原因后回答。它太简单了,真的很棘手 方法拦截仅在将接口绑定到类而不是此实现的实例时有效 因此,不要绑定(MockCalledService.class).toInstance(新的MockCalledServiceImpl())代码> 我们应该编写
bind(MockCalledService.class).to(MockCalledServiceImpl.class)代码>
似乎没有代理实例:(我在找到真正的原因后回答。它太简单了,真的很棘手
方法拦截仅在将接口绑定到类而不是此实现的实例时有效
因此,不要使用bind(MockCalledService.class).toInstance(新的MockCalledServiceImpl());
我们应该编写bind(MockCalledService.class).to(MockCalledServiceImpl.class);
似乎没有代理实例:(我在找到真正的原因后回答。它太简单了,真的很棘手
方法拦截仅在将接口绑定到类而不是此实现的实例时有效
因此,不要使用bind(MockCalledService.class).toInstance(新的MockCalledServiceImpl());
我们应该编写bind(MockCalledService.class).to(MockCalledServiceImpl.class);
似乎没有代理实例:(我在找到真正的原因后回答。它太简单了,真的很棘手
方法拦截仅在将接口绑定到类而不是此实现的实例时有效
因此,不要使用bind(MockCalledService.class).toInstance(新的MockCalledServiceImpl());
我们应该编写bind(MockCalledService.class).to(MockCalledServiceImpl.class);
似乎没有代理实例:(应该是到(MockCalledServiceImpl.class)
,而不是toInstance
。是的,方法拦截是通过在运行时生成子类来实现的,因此它不能应用于任意实例。我提到了原因,但如果我们想实现一个代理委托来用于特定类型的任何和所有实例是完全可能的。您认为有什么挑战?首先,不可能有任何final方法,因为它们不能被委托实现覆盖。但我不认为这个限制特定于实例绑定。final方法即使是类绑定也会阻止拦截。不是吗?另一个原因是toInstance()
绑定保证与提供的实例相同(使用==
),并将其更改为向后不兼容。应为(MockCalledServiceImpl.class)
,而不是toInstance
。是的,方法拦截是通过在运行时生成子类来实现的,因此它不能应用于任意实例。我提到了原因,但如果我们想实现一个代理委托来用于特定类型的任何和所有实例是完全可能的。您认为有什么挑战?首先,不可能有任何final方法,因为它们不能被委托实现覆盖。但我不认为这个限制特定于实例绑定。final方法即使是类绑定也会阻止拦截。不是吗?另一个原因是toInstance()
绑定保证与提供的实例相同(使用==
),并将其更改为向后不兼容。应为(MockCalledServiceImpl.class)
,而不是toInstance
。是的,方法拦截是通过在运行时生成子类来实现的,因此它不能应用于任意实例。我提到了原因,但如果我们想实现一个代理委托来用于特定类型的任何和所有实例是完全可能的。您认为有什么挑战?首先,不可能有任何final方法,因为它们不能被委托实现覆盖。但我不认为这个限制特定于实例绑定。final方法即使是类绑定也会阻止拦截。不是吗?另一个原因是toInstance()
绑定保证与提供的实例相同(使用==
),并将其更改为向后不兼容。应为(MockCalledServiceImpl.class)
,而不是toInstance
。是的,方法拦截是通过在运行时生成子类来实现的,因此它不能应用于任意实例。我提到了原因,但如果我们想实现一个代理委托来用于特定类型的任何和所有实例是完全可能的。您认为有什么挑战?首先,不可能有任何final方法,因为它们不能被委托实现覆盖。但我不认为这个限制特定于实例绑定。final方法即使是类绑定也会阻止拦截。不是吗?另一个原因是toInstance()
绑定保证与所提供的实例相同(使用==
),更改绑定将不兼容。