我创建了一个使用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进行集成,但它们似乎都没有工作。
任何人都可以帮助我吗?
我错过了还是做错了什么?
答案 0 :(得分:-1)
我认为拦截器不在Java EE容器外工作。我想独立Weld只能做DI但不能做其他功能。另请参阅此帖子:Is it possible to use javax.interceptor in a Java SE environment?