我创建了一个使用Weld-2.2.0 CDI实现并在Tomcat-7上运行的Web应用程序。我创建了一个拦截器来记录方法调用。但是,当我运行该应用程序时,它会绕过拦截器并直接调用方法。
我的拦截器构造如下:
拦截器绑定:
@Inherited @InterceptorBinding @Retention(RUNTIME) @Target({METHOD, TYPE}) public @interface LogMe{ }
拦截器类别:
@LogMe @Interceptor public class LogInterceptorImpl { private static final Logger log = LogManager.getLogger(LogInterceptorImpl.class); @AroundInvoke public Object intercept(InvocationContext ctx) throws Exception { log.debug("LogInterceptor::intercept"); return ctx.proceed(); } }
拦截目标:
@LogMe public class DefaultAppController extends AbstractBaseController { private static final long serialVersionUID = 1L; public DefaultAppController() { } @Override @LogMe public void processRequest(HttpServletRequest req, HttpServletResponse resp) throws IOException, ServletException { resp.getWriter().write("Hello, Guest !"); } }
最后,我创建了beans.xml文件,如下所示:
<beans xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/beans_1_0.xsd"> <interceptors> <class>x.web.interceptors.LogInterceptorImpl</class> </interceptors> </beans>
我还在context.xml文件和web.xml文件中创建了焊接资源参考(如焊接文档所述)。
<Resource name="BeanManager" auth="Container" type="javax.enterprise.inject.spi.BeanManager" factory="org.jboss.weld.resources.ManagerObjectFactory" />
和
<resource-env-ref> <resource-env-ref-name>BeanManager</resource-env-ref-name> <resource-env-ref-type>javax.enterprise.inject.spi.BeanManager</resource-env-ref-type> </resource-env-ref>
我尝试了很多选择,包括使用weld-tomcat-support jar进行集成,但是似乎都没有用。
有谁可以帮我离开这里吗 ?
我在这里想念还是做错了什么?
我不认为拦截器在JavaEE容器之外工作。我想独立的Weld只能做DI,而不能做其他功能。