Fehler beim privaten Zugriff der CDI-injizierten äußeren Klasse aus der statischen inneren Klasse

StackOverflow https://stackoverflow.com//questions/21029071

  •  21-12-2019
  •  | 
  •  

Frage

Ich habe (in einer minimalistischen Version) die folgenden CDI-verwalteten Beans in JBoss EAP 6.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");
        }
    }
}

Und der folgende Code, um dies zu testen (fragen Sie nicht warum.Es ist nur für diese Vitrine.):

@Inject
Outer outer;

@Inject
Outer.Inner inner;

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

Ich erhalte eine Ausgabe von:

Values: {}

wo ich den Wert foo erwartet hätte.

Weitere Untersuchungen ergaben, dass der Anruf bei private void addValue greift auf eine Version von zu values Attribut, das in einem von Weld generierten Proxy von lebt Outer während der Aufruf zu public void printValues greift auf das reale Attribut der realen verwalteten Bean-Instanz zu.

Um die Sache noch verwirrender zu machen:Wenn ich die Zugriffsebene von ändere addValue zu einem von package, protected oder public alles funktioniert wie erwartet.

Der Zweck der inneren Klasse bestand in meinem Fall jedoch darin, die Methode privat zu machen, sodass andere CDI-Clients von Outer die Methode nicht aufrufen können.Und das ist das Einzige, was nicht funktioniert :D

Irgendeine Idee, was los ist?Ist das ein Fehler in Weld?

War es hilfreich?

Lösung

Derzeit verwenden alle CDI-Anbieter Proxys (dies ist in der Spezifikation nicht erforderlich, aber alle drei Impls wurden so durchgeführt), um alle nicht pseudobereichsbezogenen Objekte einzuschleusen.Wenn Outer war @DependantScoped Ich bin mir ziemlich sicher, dass es so funktionieren würde, wie Sie es möchten.Die erstellten Proxys sind natürlich Unterklassen Ihrer Klassen, daher wird der Aufruf einer privaten Methode für ein injiziertes Objekt nicht funktionieren.Ehrlich gesagt bin ich überrascht, dass es nicht explodiert.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top