我不拦截踢时,它应该不踢,即使它注册豆类和文件提供任何警告。我错过了什么?CDI拦截器在
编辑1:我希望能够在每一个Genres.java
函数被调用,离开的时间进行记录,但我没有这个配置让任何输出。
编辑2:在遵循Svetlin的建议来应用断点之后,我可以确认代码永远不会到达拦截器或生产者。
的beans.xml
<beans xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/beans_1_1.xsd"
version="1.1" bean-discovery-mode="all">
<interceptors>
<class>no.krystah.log.LoggingInterceptor</class>
</interceptors>
</beans>
LoggingInterceptor.java
package no.krystah.log;
import javax.inject.Inject;
import javax.interceptor.AroundConstruct;
import javax.interceptor.AroundInvoke;
import javax.interceptor.Interceptor;
import javax.interceptor.InvocationContext;
import org.slf4j.Logger;
@Log @Interceptor
public class LoggingInterceptor {
@Inject
Logger logger;
@AroundConstruct
private void init(InvocationContext ic) throws Exception {
logger.info("Entering constructor");
try {
ic.proceed();
} finally {
logger.info("Exiting constructor");
}
}
@AroundInvoke
public Object logMethod(InvocationContext ic) throws Exception {
logger.info(ic.getTarget().toString()+" - "+ ic.getMethod().getName());
try {
return ic.proceed();
} finally {
logger.info(ic.getTarget().toString()+ " - "+ ic.getMethod().getName());
}
}
}
Log.java
package no.krystah.log;
import static java.lang.annotation.ElementType.METHOD;
import static java.lang.annotation.ElementType.TYPE;
import static java.lang.annotation.RetentionPolicy.RUNTIME;
import java.lang.annotation.Inherited;
import java.lang.annotation.Retention;
import java.lang.annotation.Target;
import javax.interceptor.InterceptorBinding;
@Inherited
@InterceptorBinding
@Retention(RUNTIME)
@Target({METHOD, TYPE})
public @interface Log {
}
LoggerProducer.java
package no.krystah.log;
import javax.enterprise.inject.Produces;
import javax.enterprise.inject.spi.InjectionPoint;
import javax.faces.bean.SessionScoped;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@SessionScoped
public class LoggerProducer {
@Produces
public Logger produceLogger(InjectionPoint injectionPoint) {
return LoggerFactory.getLogger(injectionPoint.getMember().getDeclaringClass().getName());
}
}
Genres.java
package no.krystah;
import java.util.ArrayList;
import java.util.List;
import javax.annotation.Resource;
import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import javax.faces.component.UIComponent;
import javax.faces.component.UIInput;
import javax.faces.context.FacesContext;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.transaction.UserTransaction;
import no.krystah.entity.Genre;
import no.krystah.log.Log;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@Log
@ManagedBean
@SessionScoped
public class Genres {
public Genres() { }
/* Functions */
}
确定拦截器不被调用?这有可能是你的记录可能会被设定为更高的日志记录级别比你的记录(对于instanace记录器被设置为错误,但你与级别调试日志记录 - >这样会导致什么的,这将出现在日志)。请在'@ AroundInvoke'方法上设置一个断点并检查它是否被调用。 – 2014-12-05 19:07:53
嘿Svetlin,谢谢你的回复。我正在登录到INFO级别,因为当我手动创建记录器对象并使用它们时,它工作正常;所有输出达到标准输出。我知道如何设置断点,但我不知道如何在Web应用程序中“触及”它们。 – krystah 2014-12-05 19:27:00
您必须在调试模式下运行您的应用程序。通常这涉及重新启动应用程序服务器。在eclipse中,您可以右键单击您的服务器,然后单击“在调试模式下重新启动”选项。除了使用断点之外,您还可以使用ERROR进行登录,以查看输出是否会达到stdout。但是无论如何,检查拦截器方法是否被调用都是很好的方法。 – 2014-12-05 19:32:02