Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

@Inject "klasy bazowej"

18 views
Skip to first unread message

Jadalbert

unread,
Dec 2, 2016, 11:32:06 AM12/2/16
to
Nie rozumiem takiej sytuacji (java + jsf):

public class X implements Serializable {...}

public class X1 extends X implements Serializable {...}

public class X2 extends X implements Serializable {...}

public class Run {

@Inject X y;
...
}
Oczywiście y może być (w innym miejscu kodu) X1 lub X2 w zależności od
pewnego wyboru.

W linii z @Inject mam uwagę kompilatora: "Unresolved ambiguous
dependency found as result of type safe resolution"
I program mi się nie uruchamia.

Z logu serwera jest:
Possible dependencies:
- Managed Bean [class newpackage.X1] with qualifiers [@Default @Named @Any],
- Managed Bean [class newpackage.X] with qualifiers [@Default @Named @Any],
- Managed Bean [class newpackage.X2] with qualifiers [@Default @Named @Any]

Dlaczego tak się dzieje?

arivald

unread,
Dec 3, 2016, 1:31:51 AM12/3/16
to
W dniu 2016-12-02 o 17:32, Jadalbert pisze:
Bo wybór "X1 lub X2 w zależności od pewnego wyboru." musi być znany na
etapie uruchamiania,czyli np. poprzez @Qualifier.

Jak chcesz to zmieniać dynamicznie (X1 lub X2), to przypisuj jawnie.

Albo zamiast X użyj fabryki Xów (lub raczej selektora Xów), która w
zależności od czegoś zwróci X1 lub X2, oba nadal mogą być singletonami.

A generalnie ten wzór z @Inject X, uzywaj X1 jest używany dla X będącego
interfejsem, a X1 implementacją tego interfejsu. Wtedy działa bezproblemowo.

--
Arivald

Jadalbert

unread,
Dec 3, 2016, 3:00:02 AM12/3/16
to
W dniu 03.12.2016 o 07:32, arivald pisze:
> W dniu 2016-12-02 o 17:32, Jadalbert pisze:
>> Nie rozumiem takiej sytuacji (java + jsf):
>>
>> public class X implements Serializable {...}
>>
>> public class X1 extends X implements Serializable {...}
>>
>> public class X2 extends X implements Serializable {...}
>>
>> public class Run {
>>
>> @Inject X y;
>> ...
>> }
>> Oczywiście y może być (w innym miejscu kodu) X1 lub X2 w zależności od
>> pewnego wyboru.
>>
>> W linii z @Inject mam uwagę kompilatora: "Unresolved ambiguous
>> dependency found as result of type safe resolution"
>> I program mi się nie uruchamia.
>>
>> Z logu serwera jest:
>> Possible dependencies:
>> - Managed Bean [class newpackage.X1] with qualifiers [@Default @Named
>> @Any],
>> - Managed Bean [class newpackage.X] with qualifiers [@Default @Named
>> @Any],
>> - Managed Bean [class newpackage.X2] with qualifiers [@Default @Named
>> @Any]
>>
>> Dlaczego tak się dzieje?
>
Dzięki za odpowiedź.
> Bo wybór "X1 lub X2 w zależności od pewnego wyboru." musi być znany na
> etapie uruchamiania,czyli np. poprzez @Qualifier.

Tak to właśnie zrozumiałem (i jest przecież napisane w logu serwera).
Jednak wykonanie tego przykładu w "czystej" javie nie powodowało żadnych
problemów. Stąd zdziwko.
>
> Jak chcesz to zmieniać dynamicznie (X1 lub X2), to przypisuj jawnie.
>
> Albo zamiast X użyj fabryki Xów (lub raczej selektora Xów), która w
> zależności od czegoś zwróci X1 lub X2, oba nadal mogą być singletonami.
>
> A generalnie ten wzór z @Inject X, uzywaj X1 jest używany dla X będącego
> interfejsem, a X1 implementacją tego interfejsu. Wtedy działa
> bezproblemowo.
>
Obadam te rozwiązania.

0 new messages