web-dev-qa-db-fra.com

est-il possible d'ajouter des qualificatifs dans @RequiredArgsConstructor (onConstructor = @__ (@ Autowired))?

Si je voulais utiliser l'annotation @Qualifier sur une injection de dépendance de constructeur, j'aurais quelque chose comme:

public class Example {

    private final ComponentExample component;

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

Je sais que l'annotation lombok pour réduire le code standard et qu'il n'est pas nécessaire d'inclure un constructeur serait la suivante: @RequiredArgsConstructors(onConstructor=@__(@Inject)), mais cela ne fonctionne qu'avec des propriétés sans qualificateurs.

Quelqu'un sait s'il est possible d'ajouter des qualificatifs dans @RequiredArgsConstructor(onConstructor = @__(@Autowired))?

17
Pau

EDIT:

Il estENFINPOSSIBLEde le faire! Vous pouvez avoir un service défini comme ceci:

@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
   }

 } 

Pourvu que vous ayez un fichier lombok.config comme celui-ci à la racine du projet:

# 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

Cela a été récemment introduit dans la dernière version 1.18.4 de Lombok. J'en ai parlé dans mon billet de blog et je suis fier de dire que j'ai été l'un des principaux moteurs de la mise en œuvre de cette fonctionnalité.

7
Nikola Yovchev

Vous pouvez utiliser l'astuce de printemps pour qualifier le champ en le nommant avec le qualificateur souhaité sans l'annotation @Qualifier.

@RequiredArgsConstructor
public class ValidationController {

  //@Qualifier("xmlFormValidator")
    private final Validator xmlFormValidator;

Pour moi, il semble que le

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

travaille aussi (probablement j'utilise le plus récent lombok?)

exemple de code

0
kecso