2017-02-04 1 views
0

Скажите, что я класс A, который вводит aclass B. В классе BI требуется неявно получить класс, который имеет класс инъекции B. Таким образом, в этом случае это будет класс A.Как разрешить из Injeactable свой класс вызывающего?

Кто-нибудь знает, как получить это надежным способом?

Пробовал это также, но это дает мне Logger не его вызывающий.

Something like 

@Stateless 
@Dependent 
public class Logger { 

@Inject 
InjectionPoint ip; 

@Asynchronous 
public void doSomething(){ 
    ip.getMember().getDeclaringClass().getName() 
} 
} 

ответ

2

Если речь идет о @Dependent скошенных бобы, то есть a way documented in the CDI spec.

Общая идея заключается в том, что CDI позволяет вводить объект с именем InjectionPoint, и из этого вы можете получить информацию о том, какой компонент был добавлен в этот компонент.

Вот короткий отрывок:

@Dependent //if you don't declare any scope, it's @Dependent by default 
public class MyBean { 
    @Inject 
    InjectionPoint ip; 

    public void doStuff() { 
    // gives you the name of declaring class 
    ip.getMember().getDeclaringClass().getName(); 
    } 
} 

В качестве альтернативы, вы можете использовать инъекции конструктора в вашем боба, чтобы справиться с этим при создании компонента. Это может быть ближе к тому, что вы стремитесь к возможно:

@Dependent //if you don't declare any scope, it's @Dependent by default 
public class MyAnotherBean { 
    public MyAnotherBean(InjectionPoint ip) { 
    // CDI will inject InjectionPoint automatically 
    ip.getMember().getDeclaringClass().getName(); 
    } 
} 

Опять же, обратите внимание, что это работает для @Dependent только! Зачем? Ну, потому что @Dependent создает новый экземпляр на точку инъекции и не использует прокси. Поэтому вы точно знаете, для кого вы создаете этот экземпляр. Другие области, такие как @RequestScoped, @SessionScoped и т. Д., Используют прокси-сервер, и поэтому вы создаете экземпляр только одного объекта в CDI и затем передаете прокси-серверы всякий раз, когда запрашивается инъекция.

+0

Спасибо, это работает. Это действительно выглядит более элегантным решением! Спасибо за ваше четкое объяснение! – Bgvv1983

+0

@ Bgvv1983 добро пожаловать. Кстати, я вижу, что вы определили свой собственный ответ как решение. Отвечает ли мой ответ на что-нибудь? Просто спрашиваю, могу ли я/мог предоставить дополнительную информацию :) – Siliarus

+0

Hmzz кажется, что он не работает ip.getMember(). GetDeclaringClass(). GetName(); дает MyBean.class. – Bgvv1983

1

Похоже, что я нашел решение.

Сделано HelperClass. которые содержат метод @AroundInvoke.

@AroundInvoke 
public Object injectMap(InvocationContext ic) throws Exception { 
    StackTraceElement element = Thread.currentThread().getStackTrace()[CLASS_NAME_ELEMENT]; 
    return ic.proceed(); 
} 

В классе А я аннотирования метод, который нуждается использует инъекционный класса B с:

@Interceptors(ContextHelper.class) 

Это похоже на работу за то, что я хочу.

+0

Хотя это может сработать, кажется, довольно хардкор. Во всяком случае, я бы посоветовал использовать перехватчики CDI (например, аннотации '@ Interceptor' и' @ InterceptorBinding'), а не EJB, как вы здесь. Хотя это может сработать, перехватчики EJB не являются в первую очередь гражданами первого класса в CDI. – Siliarus

Смежные вопросы