Is het mogelijk om kwalificaties toe te voegen in @RequiredArgsConstructor(onConstructor = @__(@Autowired))?

Als ik de annotatie @Qualifierzou willen gebruiken voor een injectie van constructorafhankelijkheid, zou ik zoiets als het volgende hebben:

public class Example {
    private final ComponentExample component;
    @Autowired
    public Example(@Qualifier("someComponent") ComponentExample component) {
        this.component = component;
    }
}

Ik ken de annotaties van Lombok om boilerplate-code te verminderen en geen constructor op te nemen, zou als volgt zijn: @RequiredArgsConstructors(onConstructor=@__(@Inject))maar dit werkt alleen met eigenschappen zonder kwalificaties.

Iedereen weet of het mogelijk is om kwalificaties toe te voegen in @RequiredArgsConstructor(onConstructor = @__(@Autowired))?


Antwoord 1, autoriteit 100%

BEWERKEN:

Het is EINDELIJKMOGELIJKom dit te doen! U kunt een dienst als volgt definiëren:

@Service
@RequiredArgsConstructor
public class SomeRouterService {
   @NonNull private final DispatcherService dispatcherService;
   @Qualifier("someDestination1") @NonNull private final SomeDestination someDestination1;
   @Qualifier("someDestination2") @NonNull private final SomeDestination someDestination2;
   public void onMessage(Message message) {
       //..some code to route stuff based on something to either destination1 or destination2
   }
 } 

Op voorwaarde dat je een lombok.config-bestand als dit in de hoofdmap van het project hebt:

# Copy the Qualifier annotation from the instance variables to the constructor
# see https://github.com/rzwitserloot/lombok/issues/745
lombok.copyableAnnotations += org.springframework.beans.factory.annotation.Qualifier

Dit is onlangs geïntroduceerd in de nieuwste lombok 1.18.4, ik heb erover geschreven in mijn blogpost, en ik ben er trots op te kunnen zeggen dat ik een van de belangrijkste drijvende krachten was die aandrongen op de implementatie van de functie.


Antwoord 2, autoriteit 10%

Je kunt een springtruc gebruiken om het veld te kwalificeren door het een naam te geven met de gewenste kwalificatie zonder @Qualifier-annotatie.

@RequiredArgsConstructor
public class ValidationController {
  //@Qualifier("xmlFormValidator")
    private final Validator xmlFormValidator;

Antwoord 3

Voor mij lijkt het de

@RequiredArgsConstructor(onConstructor=@__(@Autowired))

werkt ook (waarschijnlijk gebruik ik nieuwere lombok?)

voorbeeld code


Antwoord 4

Ik heb niet getest of het geaccepteerde antwoord goed werkt, maar in plaats van het configuratiebestand van Lombok te maken of te bewerken, denk ik dat de schonere manier is om de lidvariabele te hernoemen naar welke naam je wilt kwalificeren.

// Error code without edit lombok config
@Service
@RequiredArgsConstructor(onConstructor = @__(@Autowired))
public class Foo {
    @Qualifier("anotherDao") UserDao userDao;
}

Verwijder gewoon @Qualifier en verander de naam van uw variabele

// Works well
@Service
@RequiredArgsConstructor(onConstructor = @__(@Autowired))
public class Foo {
    UserDao anotherDao;
}

Other episodes