2017-02-04 6 views
0

나는 클래스 B를 주입하는 클래스 A라고 말합니다. 클래스 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 메서드가 포함되어 있습니다.

@Interceptors(ContextHelper.class) 

이 내가 원하는 것을 위해 작동하는 것 같다 : 클래스 A에서

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

내가 필요로하는 방법과 주사 클래스 B를 사용하여 주석을 달 수 있습니다.

+0

이것이 작동하는 동안, 그것은 꽤 하드 코어처럼 보입니다. 어쨌든, 여기있는 것처럼 EJB 대신에 CDI 인터셉터 (예 : 주석 @ Interceptor 및 @InceptorBinding)를 사용하는 것이 좋습니다. 이것이 가능할 수도 있지만, EJB 인터셉터는 정확히 CDI의 일류 시민은 아닙니다. – Siliarus