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.