Reputation: 17773
I have this class that is essentially a config class for one bean that is configured based on configuration file. It's "output" is a list of auditorium objects:
package ua.xxx.spring.hometask;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;
import org.springframework.context.support.PropertySourcesPlaceholderConfigurer;
import org.springframework.stereotype.Component;
import ua.xxx.spring.hometask.domain.Auditorium;
import java.util.*;
@PropertySource("classpath:auditorium.properties")
public class AuditoriumConfig {
@Value("${olkuszAuditorium.name}")
private String auditorium1Name = null;
@Value("#{'${olkuszAuditorium.vipSeats}'.split(',')}")
private Set<Long> auditorium1VipSeats = null;
@Value("${olkuszAuditorium.numberOfSeats}")
private Long auditorium1NumberOfSeats = 0L;
@Value("${krakowAuditorium.name}")
private String auditorium2Name = "";
@Value("#{'${krakowAuditorium.vipSeats}'.split(',')}")
private Set<Long> auditorium2VipSeats = null;
@Value("${krakowAuditorium.numberOfSeats}")
private Long auditorium2NumberOfSeats = 0L;
@Bean(name = "auditoriums")
public Set<Auditorium> getAuditoriums() {
Auditorium a1 = new Auditorium();
a1.setName(auditorium1Name);
a1.setNumberOfSeats(auditorium1NumberOfSeats);
a1.setVipSeats(auditorium1VipSeats);
Auditorium a2 = new Auditorium();
a2.setName(auditorium2Name);
a2.setNumberOfSeats(auditorium2NumberOfSeats);
a2.setVipSeats(auditorium2VipSeats);
return new HashSet<>(Arrays.asList(a1, a2));
}
@Bean
public static PropertySourcesPlaceholderConfigurer propertyConfig() {
return new PropertySourcesPlaceholderConfigurer();
}
}
And now I would like to use Set<Auditorium>
where needed, for instance:
@Bean
public AuditoriumService getAuditoriumService(@Qualifier(value = "auditoriums") Set<Auditorium> auditoriums) {
return new InMemoryAuditoriumServiceImpl(auditoriums);
}
But I get this exception:
Unsatisfied dependency expressed through constructor argument with index 0 of type [java.util.Set]: : No qualifying bean of type [ua.xxx.spring.hometask.domain.Auditorium] found for dependency [collection of ua.xxx.spring.hometask.domain.Auditorium]: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {@org.springframework.beans.factory.annotation.Qualifier(value=auditoriums)}; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [ua.xxx.spring.hometask.domain.Auditorium] found for dependency [collection of ua.xxx.spring.hometask.domain.Auditorium]: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {@org.springframework.beans.factory.annotation.Qualifier(value=auditoriums)}
What is wrong with my configuration?
This is how InMemory....
class looks like:
@Component
public class InMemoryAuditoriumServiceImpl implements AuditoriumService {
Set<Auditorium> config;
public InMemoryAuditoriumServiceImpl(Set<Auditorium> config) {
this.config = config;
}
}
Upvotes: 1
Views: 580
Reputation: 5659
Change @Qualifier
to @Resource
, as in:
@Bean
public AuditoriumService getAuditoriumService(@Resource(value = "auditoriums") Set<Auditorium> auditoriums) {
return new InMemoryAuditoriumServiceImpl(auditoriums);
}
Upvotes: 3