🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Thread View: pl.comp.lang.java
3 messages
3 total messages Started by Jadalbert Fri, 02 Dec 2016 17:32
@Inject "klasy bazowej"
#152088
Author: Jadalbert
Date: Fri, 02 Dec 2016 17:32
26 lines
787 bytes
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?
Re: @Inject "klasy bazowej"
#152089
Author: arivald
Date: Sat, 03 Dec 2016 07:32
43 lines
1399 bytes
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?

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
Re: @Inject "klasy bazowej"
#152090
Author: Jadalbert
Date: Sat, 03 Dec 2016 09:00
51 lines
1710 bytes
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.
Thread Navigation

This is a paginated view of messages in the thread with full content displayed inline.

Messages are displayed in chronological order, with the original post highlighted in green.

Use pagination controls to navigate through all messages in large threads.

Back to All Threads