Перехватчик CDI не срабатывает

Мой перехватчик не срабатывает, когда должен, хотя он зарегистрирован в bean-компонентах и ​​файлы не выдают никаких предупреждений. Что мне не хватает?

Редактировать 1: я хочу иметь возможность регистрировать каждый раз, когда функция в Genres.java вызывается и выходит, но я не получаю никаких результатов с этой конфигурацией.

Редактировать 2: После того, как Светлин посоветовал применить точки останова, я могу подтвердить, что код никогда не достигает ни перехватчика, ни производителя.

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());   
    }   
}   

Жанры.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 */
}

person krystah    schedule 05.12.2014    source источник
comment
Вы уверены, что перехватчик не вызывается? Возможно, ваш регистратор может быть настроен на более высокий уровень ведения журнала, чем тот, который вы регистрируете (например, для регистратора установлено значение ERROR, но вы ведете журнал с уровнем DEBUG ->, поэтому в результате ничего из этого не появится в журналах. ). Пожалуйста, установите точку останова на метод @AroundInvoke и проверьте, вызывается ли он.   -  person Svetlin Zarev    schedule 05.12.2014
comment
Привет, Светлин, и спасибо за ответ. Я регистрируюсь на уровне INFO, потому что это работало, когда я вручную создавал объекты Logger и использовал их; весь вывод достиг стандартного вывода. И я знаю, как устанавливать точки останова, но не знаю, как добраться до них в веб-приложении.   -  person krystah    schedule 05.12.2014
comment
Вы должны запустить приложение в режиме отладки. Обычно это включает перезапуск сервера приложений. В eclipse вы можете щелкнуть правой кнопкой мыши на своем сервере и выбрать параметр «Перезагрузить в режиме отладки». Вместо использования точки останова вы можете войти с ERROR, просто чтобы увидеть, достигнет ли вывод stdout. Но в любом случае хорошо проверить, вызывается ли метод перехватчика.   -  person Svetlin Zarev    schedule 05.12.2014
comment
Хорошо, точки останова работают, но перехватчик не вызывается. :/   -  person krystah    schedule 05.12.2014
comment
можете ли вы попробовать внедрить регистратор внутри класса Genres вместо перехватчика. Также какой сервер приложений вы используете?   -  person Svetlin Zarev    schedule 05.12.2014
comment
Могу я спросить, где находится ваш файл beans.xml? Поскольку java ee 7 работает без него, поэтому неправильно размещенный файл beans.xml приведет к тому, что приложение будет работать без указания ошибки.   -  person Kescha Skywalker    schedule 05.12.2014
comment
Объект Logger вводится правильно, если это делается вручную. Сервер приложений — Wildfly 8. beans.xml находится в /src/main/webapp/WEB-INF.   -  person krystah    schedule 06.12.2014
comment
Кеша Скайуокер права. Вы используете неправильные аннотации.   -  person Svetlin Zarev    schedule 06.12.2014


Ответы (1)


Я думаю, проблема в аннотации @SessionScoped, которую вы используете. Импорт указывает, что вы используете

import javax.faces.bean.SessionScoped;

Пожалуйста, переключитесь на CDI:

import javax.enterprise.context.SessionScoped;

Также вам не следует использовать аннотацию @ManagedBean, замените ее на java ee 7:

@Named
person Kescha Skywalker    schedule 05.12.2014
comment
Это было действительно так! Большое спасибо: Д - person krystah; 06.12.2014