假设我是一个注入aclass B的A类。在B类中,我需要隐式地获取注入了B类的类。所以在这种情况下,这将是A类。
有谁知道如何以健壮的方式接收这个?
也试过这个,但这给了我Logger而不是它的来电者。
Something like
@Stateless
@Dependent
public class Logger {
@Inject
InjectionPoint ip;
@Asynchronous
public void doSomething(){
ip.getMember().getDeclaringClass().getName()
}
}
答案 0 :(得分:2)
如果我们谈论的是@Dependent
范围内的bean,则会有a way documented in the CDI spec。
一般的想法是,CDI允许您注入一个名为InjectionPoint
的对象,从中可以获得有关bean注入此bean的信息。
这是一个简短的片段:
@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();
}
}
或者,您可以在bean中使用构造函数注入来在bean创建期间处理此问题。它可能更接近你的目标:
@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中实例化一个对象,然后在请求注入时传递代理。
答案 1 :(得分:1)
似乎我找到了解决方案。
制作HelperClass。其中包含@AroundInvoke方法。
@AroundInvoke
public Object injectMap(InvocationContext ic) throws Exception {
StackTraceElement element = Thread.currentThread().getStackTrace()[CLASS_NAME_ELEMENT];
return ic.proceed();
}
在A类中,我注释了需要使用注射类B的方法:
@Interceptors(ContextHelper.class)
这似乎适用于我想要的东西。