【问题标题】:class required a single bean, but 2 were found:类需要一个 bean,但找到了 2 个:
【发布时间】:2017-09-21 12:09:30
【问题描述】:

我有以下界面:

public interface MailSender {
    void sender(String to, String subject,String body);
}

有 2 个实现:

public class SmtpkMailSender implements MailSender   {

    static Log log=LogFactory.getLog(MailSender.class); 

    public void sender(String to, String subject,String body){
        log.info("SMTP To: "+to);
        log.info("SMTP Subjecy: "+subject);
        log.info("SMTP body: "+body);
    }

}

第二个是:

@Primary
public class MockMailSender implements MailSender   {

    static Log log=LogFactory.getLog(MailSender.class); 

    public void sender(String to, String subject,String body){
        log.info("To: "+to);
        log.info("Subject: "+subject);
        log.info("body: "+body);
    }

}

我在控制器类中使用了依赖注入,如下所示:

@RestController
public class MailController {

    @Autowired
    private MailSender smtpkMailSender;

    @RequestMapping("/send")
    public String send(){
        smtpkMailSender.sender("Person", "Important", "Take Care");
        return "mail is sent";
    }
}

最后我有一个包含我的 Bean 的配置类:

@Configuration
public class MailConfig {

    @Bean
    public SmtpkMailSender getSmtpkMailSender(){
        return new SmtpkMailSender();
    }

    @Bean
    public MockMailSender getMockMailSender(){
        return new MockMailSender();
    }

}

不幸的是,当我运行我的应用程序时,它会抱怨:

Description:

Field smtpkMailSender in com.example.demo.MailController required a single bean, but 2 were found:
    - getSmtpkMailSender: defined by method 'getSmtpkMailSender' in class path resource [com/example/mail/MailConfig.class]
    - getMockMailSender: defined by method 'getMockMailSender' in class path resource [com/example/mail/MailConfig.class]


Action:

Consider marking one of the beans as @Primary, updating the consumer to accept multiple beans, or using @Qualifier to identify the bean that should be consumed

如您所见,虽然我已将 MockMailSender 指定为 Primary,但 spring 仍然抱怨,无法识别它

【问题讨论】:

  • 添加限定符以拼出您打算注入的 bean。

标签: java spring spring-mvc


【解决方案1】:

您可以使用@Qualifier 注解来指定您想要自动装配的具体实现类型。

@RestController
public class MailController {

   @Autowired
   @Qualifier("smtpkMailSender")
   private MailSender smtpkMailSender;

   @RequestMapping("/send")
   public String send(){
      smtpkMailSender.sender("Person", "Important", "Take Care");
      return "mail is sent";
  }

}

【讨论】:

【解决方案2】:

由于您使用的是 java config,因此您应该使用 @Primary 注释而不是类来标记 config 方法:

@Configuration
public class MailConfig {
    @Bean
    public SmtpkMailSender getSmtpkMailSender(){
        return new SmtpkMailSender();
    }

    @Bean
    @Primary
    public MockMailSender getMockMailSender(){
        return new MockMailSender();
    }
}

【讨论】:

    【解决方案3】:

    你可以简单地命名你的 bean 使用

    @Bean(name="mockMailSender")
    public MockMailSender getMockMailSender() { }
    

    然后用

    装饰自动装配的字段
    @Autowired
    @Qualifier("mockMailSender")
    private MailSender smtpkMailSender;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-03-25
      • 2021-04-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-05-14
      • 1970-01-01
      相关资源
      最近更新 更多