문제

가(에서 최소한의 버전)는 다음과 같은 CDI 관리 콩에는 JBoss EAP6.0.1

@ApplicationScoped
public class Outer {
    private final List<String> values = new ArrayList<String>();

    public void printValues() {
        System.out.println("Values: " + values);
    }

    private void addValue(String value) {
        values.add(value);
    }

    public static class Inner {

        @Inject
        private Outer outer;

        public void addFoo() {
            outer.addValue("foo");
        }
    }
}

다음 코드와 이를 테스트하는(이유는 없다.그것은 단지에 대한 이 전시됩니다.):

@Inject
Outer outer;

@Inject
Outer.Inner inner;

public void test() {
    inner.addFoo();
    outer.printValues();
}

나의 출력:

Values: {}

어디에 내가 예상되는 가치 foo.

추가 조사를 밝혀 통화 private void addValue 액세스 버전 values 특성에 살고있는 용접 생성 프록시의 Outer 반면 전화 public void printValues 액세스 진짜 특성의 실제 bean 인스턴스입니다.

물건을 만들기 위해 더욱 복잡:변경하는 경우 액세스 수준 addValue 하의 package, protectedpublic 모든 것이 예상대로 작동합니다.

그러나 목적의 내부 클래스에서는 내 사건을 촉진하는 방법을 개인 정보 보호 정책에 따라,다른 CDI 클라이언트의 외부를 호출할 수 없습 방법입니다.지금는 작동하지 않:D

어떤 생각이 무엇이 잘못입니까?이것이 버그에서 용접?

도움이 되었습니까?

해결책

현재 모든 CDI 공급자가 사용하는 프록시(지 않에 필요한 사양,하지만 어떻게 모든 세 impls 수행 되었습니다)주사를 위한 모든 비사 범위 객체입니다.는 경우 외부였 @DependantScoped 나는 확신이 그것이 당신이 원하는 방식으로 작업합니다.프록시 만들은 자연스럽게 서브 클래스 클래스,이렇게 부르인 방법에는 주사 개체의 일 하려고 하지 않습니다.솔직히 저는 놀라지 않겠습니까?

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top