Java Spring:使用@Qualifier()-限定bean(如果可用),否则使用任意

Java Spring:使用@Qualifier()-限定bean(如果可用),否则使用任意,java,spring,spring-boot,Java,Spring,Spring Boot,我正在尝试创建一个组件,该组件将接受一个bean(fasterxmlObjectMapper) 如果有一个名为qualifiedObjectMapper的限定bean,我想使用该bean 如果没有具有该名称的bean,但有一个ObjectMapperbean,我想使用它 据我所知,如果我这样做: class MyClass( @Qualified("qualifiedObjectMapper") objectMapper: ObjectMapper ) 只有当有一个bean具有该名称时,它

我正在尝试创建一个组件,该组件将接受一个bean(
fasterxml
ObjectMapper

如果有一个名为
qualifiedObjectMapper
的限定bean,我想使用该bean

如果没有具有该名称的bean,但有一个
ObjectMapper
bean,我想使用它

据我所知,如果我这样做:

class MyClass(
  @Qualified("qualifiedObjectMapper") objectMapper: ObjectMapper
)
只有当有一个bean具有该名称时,它才会工作,但如果没有,它就不会使用另一个
ObjectMapper
bean(如果有多个,则使用主bean)

有没有办法使用限定的,如果它存在的话,或者使用主要的?

试试这个

    @Autowired
private ApplicationContext applicationContext;

@Autowired
private ObjectMapper objectMapper;
然后

    try {
    ObjectMapper obj = applicationContext.getBean("qualifiedObjectMapper");
    //use qualifier
}catch(Exception e) {
    //use objectMapper
}

为此,您可以使用
@Configuration
类,在该类中,您可以基于主bean和可选bean创建另一个合格bean:

@Configuration
class Config {
    @Primary @Bean
    ObjectMapper primary() {...}

    @Bean
    ObjectMapper qualified(){...}

    @Bean
    ObjectMapper resulted(ObjectMapper primary, 
                         @Autowired(required = false)  @Qualifier("qualified") ObjectMapper qualified){
       return qualified == null ? primary : qualified;
    }
}
并将结果bean用作:

@Service
class MyService {
    MyService(@Qualifier("resulted") ObjectMapper mapper) {...}
}

您是否有权使用XML(
primary=“true”
)或Java注释
@primary
限定对象映射器标记为主映射器?可能,但在这种情况下,它不一定是主映射器。它可能是一个仅用于此目的的辅助程序,而主程序则在整个应用程序中使用。我真的不想使用
applicationContext.getBean(“”
)。虽然它在技术上可行,但使用它也有很多缺点。(请注意,我不是那个被否决的人……这不是我想要的,但这不是个坏主意。)