我们不想在tomcat 8.5下使用guice作为提供者使用aop方法拦截器。我们目前已经在我们的Java-FX应用程序中使用拦截器和guice而没有任何问题。
尝试在Tomcat下执行相同操作不起作用。对象通过guice注入到servlet中,但这些对象的带注释的方法没有绑定到拦截器。看起来guice可能认为cglib / asm不可用并且恢复到无所不知。
servlet容器需要满足特殊的前提条件才能使用guice的aop吗?如上所述,guice / cglib / asm的相同配置适用于任何webapp项目。
@Singleton
public class TestServlet extends HttpServlet {
@Inject
X x;
public TestServlet() {
System.out.println("constructor");
try {
throw new IOException();
} catch (final Exception e) {
e.printStackTrace();
}
}
@Override
protected void doGet(final HttpServletRequest req, final HttpServletResponse resp)
throws ServletException, IOException {
testMethod(resp);
}
protected void testMethod(final HttpServletResponse resp) throws IOException {
x.test(resp);
}
}
我们在servlet中使用X来包含被拦截的方法。 通过将throw / catch事物放在构造函数中,我们验证了构造函数是通过guice调用的。
public class X {
@Y
public int test(final ServletResponse res) throws IOException {
res.getWriter().write("123");
return 1;
}
}
public class TestInterceptor implements MethodInterceptor {
@Override
public Object invoke(final MethodInvocation arg0) throws Throwable {
System.out.println("METHOD INTERCEPTOR " + arg0);
return arg0.proceed();
}
}
public class Module extends AbstractModule {
@Override
protected void configure() {
System.out.println("TestInterceptor configuration");
bindInterceptor(Matchers.any(), Matchers.annotatedWith(Y.class), new TestInterceptor());
}
}
@WebListener
public class BootStrap extends GuiceServletContextListener {
...
@Override
protected Injector getInjector() {
final Injector inject = Guice.injector(new Module(), new ServletModule() {
@Override
protected void configureServlets() {
super.configureServlets();
System.out.println("Injector");
serve("/test2/*").with(TestServlet.class);
}
});
return inject;
}
}
servlet是可以访问的,X是非空的,但是在调试器中查看它很明显没有进行二进制代码修改。
我们在这里错过了什么吗?任何人都可以链接一个工作guice(4 +)/ tomcat(8 +)/ aop示例的例子吗?
修改
事实证明它与servlet容器无关。问题在于guice本身。对不起,这个问题非常困难。 对于那些感兴趣的人我们开了一个问 https://github.com/google/guice/issues/1094
请注意,在撰写本文时,我们不接受此错误。也可能是我们错过了解释javadoc。
答案 0 :(得分:2)
我之前使用过Guice AOP和Tomcat(尽管它是Tomcat的旧版本)并且AOP正常工作。 (我无法链接,因为它是专有代码)。
我注意到你发布的代码有一件事是你没有使用GuiceFilter,我认为这是必需的。
如上所述here,您需要在web.xml的顶部配置它,如下所示:
<filter>
<filter-name>guiceFilter</filter-name>
<filter-class>com.google.inject.servlet.GuiceFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>guiceFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
根据评论进行修改: 您不必修改/破解类加载器以在servlet容器中使用Guice拦截器。它们应该开箱即用,无需额外更改。