2012-06-06 9 views
5

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.

Odpowiedz

2

Od trawienie kilka różnych odpowiedzi tu i gdzie indziej, rozwiązanie mam przyjęty jest użycie @Typed adnotacji o wartości Object.class na moim fasoli.Oznacza to, że będzie to tylko kwalifikują być wstrzykiwane do pól, które są zadeklarowane tak:

@Inject 
private Object something; 

... które na szczęście okazały się dość dużo nie istnieje. :-)

1

Co chciałbym zrobić, to jakoś zmusić produkcję Osoba przypadki, w tej aplikacji, aby zawsze trasie przez producenta metody.

Spoina lutownicza has a solution do tego.

Nie jestem w 100% pewny, jak to się rozwinie dzięki scaleniu Seam 3 i Deltaspike (strona jest taka 90, ale zawartość kołysze :-), ale umieszczenie Soldera w swojej klasie jest z pewnością bezpiecznym.

Aha, o ile wiem, porównywalny mechanizm wprowadził go do specyfikacji CDI 1.1.

+0

Więc zasadniczo: nie można wymusić tego, z wyjątkiem używania adnotacji '@ Typed' w CDI 1.0? –

+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 ...!? –

+0

'@ 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. –

3

Napisz adnotację PersonBean jako @Alternative, a następnie użyje metody producenta.