Część mojego problemu polega na użyciu odpowiedniego słownictwa, więc z góry przepraszam za to, co może być prostą sprawą terminologii.Jak wymusić użycie metody producenta CDI?
Załóżmy, że mam interfejs Person
i klasę PersonBean
, która implementuje ten interfejs.
Załóżmy, że mam gdzieś metodę producenta (z komentarzem @Produces
), która zwraca Person
. Wewnętrznie zwraca nową PersonBean
, ale to ani tutaj, ani tam.
Wreszcie, przypuśćmy, mam inny fasoli CDI gdzieś z punktu wtrysku zdefiniowane następująco:
@Inject
private Person person;
Zakładając, mam wszystkie moje beans.xml
plików w miejsce itd i nie bootstrapped Weld lub inny CDI-1,0-zgodny środowisko, ponieważ to wszystko oznacza, że otrzymam dwuznaczny błąd definicji. To ma sens: Weld znajdzie moją PersonBean
jako kandydata do wstrzyknięcia (może to po prostu wywołać konstruktora) i znajdzie wyjście mojej metody producenta jako kandydata do wstrzyknięcia.
To, co chciałbym zrobić, to jakoś wymuszać produkcję instancji Person
w tej aplikacji, aby zawsze prowadzić przez metodę producenta.
Rozumiem, że mógłbym wynaleźć jakiś kwalifikator gdzieś i sprawić, że metoda producenta wytworzy Person
wystąpienia kwalifikowane przez ten kwalifikator. Jeśli to zrobię, i zmienię swój punkt iniekcji, aby uwzględnić kwalifikator, to oczywiście istnieje tylko jedno źródło tych kwalifikowanych preparatów do wstrzykiwania (mianowicie moja metoda producenta), a więc voila, problem został rozwiązany.
Ale przypuśćmy, że nie chcę wymyślać jakiegoś fałszywego kwalifikatora. (Nie mówię, że tak jest, po prostu staraj się głębiej zrozumieć problemy.) Jakie są moje opcje? Czy mam jakieś? Przypuszczam, że mogę umieścić @Typed(Object.class)
na PersonBean
zrobić to tak, aby nie był postrzegany jako Person
przez CDI ....
Wszelkie pomysły mile widziane, w tym odnośniki do dokumentacji, lub lepszych sposobów, aby to zrozumieć. Dzięki.
Więc zasadniczo: nie można wymusić tego, z wyjątkiem używania adnotacji '@ Typed' w CDI 1.0? –
Nie jestem pewien, czy rozumiem Twój komentarz. Możesz wymusić produkcję niezależnie, używając '@ Unwraps' z programu Solder. I nie ma czegoś takiego jak "@ Wpisany" w CDI ...!? –
'@ Wpisany': http://docs.oracle.com/javaee/6/api/javax/enterprise/inject/Typed.html Krótko, ty dławisz z powrotem typy fasoli, które eksponuje twoja fasola, na CDI innards. Byłby to jeden ze sposobów odróżnienia maszyn CDI od trzymania rąk od obiektu i umożliwienia twojej producentowi bezpośredniego utworzenia instancji. Mój przypadek użycia tworzy instancję 'Logger' (bez konstruktora no-arg!), Dzięki czemu mogę kontrolować' LogRecord', który tworzy podczas logowania. –