2014-12-05 174 views
0

我不拦截踢时,它应该不踢,即使它注册豆类和文件提供任何警告。我错过了什么?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 */ 
} 
+0

确定拦截器不被调用?这有可能是你的记录可能会被设定为更高的日志记录级别比你的记录(对于instanace记录器被设置为错误,但你与级别调试日志记录 - >这样会导致什么的,这将出现在日志)。请在'@ AroundInvoke'方法上设置一个断点并检查它是否被调用。 – 2014-12-05 19:07:53

+0

嘿Svetlin,谢谢你的回复。我正在登录到INFO级别,因为当我手动创建记录器对象并使用它们时,它工作正常;所有输出达到标准输出。我知道如何设置断点,但我不知道如何在Web应用程序中“触及”它们。 – krystah 2014-12-05 19:27:00

+0

您必须在调试模式下运行您的应用程序。通常这涉及重新启动应用程序服务器。在eclipse中,您可以右键单击您的服务器,然后单击“在调试模式下重新启动”选项。除了使用断点之外,您还可以使用ERROR进行登录,以查看输出是否会达到stdout。但是无论如何,检查拦截器方法是否被调用都是很好的方法。 – 2014-12-05 19:32:02

回答

3

我认为这个问题是您正在使用的@SessionScoped注解。进口表明您正在使用

import javax.faces.bean.SessionScoped; 

请切换到CDI一个:

import javax.enterprise.context.SessionScoped; 

而且你不应该使用@ManagedBean批注,请更换它通过Java EE 7之一:

@Named 
+0

确实是这样!非常感谢:D – krystah 2014-12-05 21:21:49