Is it possible to add qualifiers in @RequiredArgsConstructor(onConstructor = @__(@Autowired))?

JavaSpringDependency InjectionLombok

Java Problem Overview


If I wanted to use the annotation @Qualifier on a constructor dependency injection, I would have something like the following:

public class Example {

    private final ComponentExample component;

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

I know Lombok's annotations to reduce boilerplate code and don't have to include a constructor would be as follows: @RequiredArgsConstructors(onConstructor=@__(@Inject)) but this only works with properties without qualifiers.

Anyone know if it is possible to add qualifiers in @RequiredArgsConstructor(onConstructor = @__(@Autowired))?

Java Solutions


Solution 1 - Java

EDIT:

It is FINALLY POSSIBLE to do so! You can have a service defined like this:

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

 } 

Provided that you have a lombok.config file like this in the root of the project:

# 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

This was recently introduced in latest lombok 1.18.4, I wrote about it in my blogpost, and I am proud to say I was one of the main driving forces pushing for the implementation of the feature.

Solution 2 - Java

You may use spring trick to qualify field by naming it with desired qualifier without @Qualifier annotation.

@RequiredArgsConstructor
public class ValidationController {

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

Solution 3 - Java

I haven't test whether the accepted answer works well, but instead of create or edit lombok's config file, I think the cleaner way is rename the member variable to which name you want to qualifier.

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

Just remove @Qualifier and change your variable's name

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

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionPauView Question on Stackoverflow
Solution 1 - JavaNikola YovchevView Answer on Stackoverflow
Solution 2 - JavaАлексей ВиноградовView Answer on Stackoverflow
Solution 3 - JavascottView Answer on Stackoverflow