【问题标题】:Spring @Qualifier not working, but @Resource does? [duplicate]Spring @Qualifier 不起作用,但 @Resource 可以吗? [复制]
【发布时间】:2017-06-09 13:55:22
【问题描述】:

我有以下代码:

@Qualifier("dateObjectMapper")
private ObjectMapper mapper;

@Autowired
DefaultProjectTweetSearchProvider(
        Client client,
        ObjectMapper mapper) {
    this.client = client;
    this.mapper = mapper;
}

上面的代码不起作用。我收到一条错误消息,指出 spring 容器无法决定在 ObjectMapper 的构造函数中使用哪个 bean。如果我将@Resource(name = "dateObjectMapper") 放在我的mapper 字段上方,它就可以工作。为什么它在这种情况下工作?我有 2 个 ObjectMapper 豆子,像这样:

@Bean
ObjectMapper dateObjectMapper() {
   // ... 
}

@Bean
@Primary
ObjectMapper defaultObjectMapper() {
   // ... 
}

【问题讨论】:

  • @Qualifier("dateObjectMapper") 添加到方法dateObjectMapper()
  • 所以您必须注释 Bean 名称(方法)和引用该 bean 的字段?
  • 不,不是重复的。我的构造函数上有@Autowired,而不是我的字段。我不需要将@Autowired 放在我的字段上方。
  • 这就是文档所说的:7.9.4 Fine-tuning annotation-based autowiring with qualifiers。但正如它所说:对于后备匹配,bean 名称被视为默认限定符值。
  • 实际上,您应该在 bean 被 定义 (@Bean) 和 bean 注入 (@Autowired)。但是,您实际上并没有在注入 bean 的地方使用 @Qualifier,因为那将是构造函数,这意味着您应该将 @Qualifier 放在构造函数 parameter 上。

标签: java spring spring-mvc


【解决方案1】:

当您使用构造函数注入时,@Qualifier 注释必须在参数上。

private ObjectMapper mapper;

@Autowired
DefaultProjectTweetSearchProvider(
        Client client,
        @Qualifier("dateObjectMapper") ObjectMapper mapper) {
    this.client = client;
    this.mapper = mapper;
}

注意 bean 名称。你的例子:

@Bean
ObjectMapper dateObjectMapper() {
   // ... 
}

@Bean
@Primary
ObjectMapper defaultObjectMapper() {
   // ... 
}

将创建与@Bean 方法同名的bean:dateObjectMapperdefaultObjectMapper

【讨论】:

  • 完美。这正是奏效的。谢谢!
猜你喜欢
  • 1970-01-01
  • 2018-08-06
  • 1970-01-01
  • 2018-01-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-12-05
  • 2017-04-24
相关资源
最近更新 更多