当前位置: 首页 > 面试题库 >

无法获得Guice方法拦截功能

寿翰飞
2023-03-14
问题内容

我正在尝试打印“你好,AOP!” 当Guice / AOP联盟拦截标有特定(自定义)注释的方法时,将显示一条消息。我按照官方的文档(可以找到一个PDF
这里 -
。AOP方法拦截的东西在第11页 ),它不能去工作,只编译。

首先,我的注释:

@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.METHOD})
@BindingAnnotation
public @interface Validating {
    // Do nothing; used by Google Guice to intercept certain methods.
}

然后,我的Module实现:

public class ValidatingModule implements com.google.inject.Module {
    public void configure(Binder binder) {
        binder.bindInterceptor(Matchers.any(), 
            Matchers.annotatedWith(Validating.class,
            new ValidatingMethodInterceptor()),
    }
}

接下来,我的方法拦截器:

public class ValidatingMethodInterceptor implements MethodInterceptor {
    public Object invoke(MethodInvocation invocation) throws Throwable {
        System.out.println("Hello, AOP!");
    }
}

最后,尝试利用所有这些AOP内容的驱动程序:

public class AopTest {
    @Validating
    public int doSomething() {
        // do whatever
    }

    public static main(String[] args) {
        AopTest test = new AopTest();

        Injector injector = Guice.createInjector(new ValidatingModule());

        System.out.println("About to use AOP...");

        test.doSomething();
    }
}

当我运行这个小小的测试驱动程序时,我得到的唯一控制台输出是About to use AOP...Hello, AOP!永不执行,这意味着该@Validating doSomething()方法永远不会像Guice文档所显示的那样被拦截。

只有
我能想到的事情是,在我的事实Module执行我指定MethodInterceptor绑定到(作为第三个参数bindInterceptor方法)为一个new ValidatingMethodInterceptor(),而在拦截器,我只是定义所需的invoke(MethodInvocation)方法。

也许我没有将这两个正确地连接在一起?也许Guice并不隐式知道invoke在发生拦截时应该运行该方法?!?!

再说一次,我不仅遵循了Guice文档,而且还遵循了其他一些教程,但无济于事。

有什么明显的我想念的地方吗?提前致谢!

编辑
我的代码和所遵循的示例之间的另一个差异(尽管很小)是,我的invoke方法(在拦截器内部)未使用注释@Override。如果我尝试添加此批注,则会出现以下编译错误:

ValidatingMethodInterceptor类型的方法invoke(MethodInvocation)必须重写超类方法。

该错误是有道理的,因为它org.aopalliance.intercept.MethodInterceptor是一个接口(不是类)。再说一次,每个使用Guice
/ AOP Alliance的示例都@Overrideinvoke方法上使用了此注释,因此它显然可以为某些人工作/编译…很奇怪。


问题答案:

如果您不让Guice构造您的对象,那么它就无法为您提供一个包裹着拦截器的实例。您一定不能new AopTest()用来获取对象的实例。相反,您必须要求Guice给您一个实例:

Injector injector = Guice.createInjector(new ValidatingModule ());
AopTest test = injector.getInstance(AopTest.class);

请参阅http://code.google.com/p/google-
guice/wiki/GettingStarted



 类似资料:
  • 问题内容: 我有这个代码 有什么方法可以在没有子类化或修改类且没有工厂的情况下拦截呼叫? 编辑:抱歉忘了提到这是在Android平台上。 问题答案: 您是否考虑过面向方面的编程,甚至还考虑过AspectJ?有关AspectJ / Android的信息,请参见此处和此处。

  • 我是不是错过了一些图书馆?

  • 在这个问题中,我遇到了与Struts 2相反的问题:仅从defaultStack截取器中排除验证方法 上面的问题涉及到所有的方法都被排除在外,我的问题是没有任何方法被排除在外! 我正在尝试让authenticationInterceptor忽略LoginAction的showLogin方法: 但是,每次我转发到loginInitial时,拦截器都会抓取它,即使我的showLogin方法被排除在外。

  • 问题很简单 在这里打破头! 编辑:一个小突破。我打印了目标,它返回的是SimpleJPrepository,而不是实际的存储库。

  • 问题内容: 我正在使用Java EE 6和Jboss AS7.1,并尝试使用拦截器绑定(来自jboss网站的示例)。 我有一个InterceptorBinding注解: 拦截器: 还有一个豆: 但是拦截器没有被称为。。。 在编写此代码时将调用拦截器: 谢谢你的帮助。 问题答案: 您是否按照参考示例中的说明启用了拦截器? 缺省情况下,bean档案没有通过拦截器绑定绑定的已启用拦截器。必须通过将侦听器

  • 我正在具体的类上创建动态代理。因为Java的普通代理类只对接口有帮助,所以我选择了cglib。 我使用带有MethodInterceptor的增强器类来拦截我的代理的方法,我能够拦截除静态方法之外的所有方法调用。 有什么方法可以使用cglib拦截对静态方法的调用吗?