类需要一个 bean,但找到了 2 个:

新手上路,请多包涵

我有以下界面:

 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 仍然抱怨,并且无法识别它

原文由 Jeff 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 568
2 个回答

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

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

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

原文由 Leffchik 发布,翻译遵循 CC BY-SA 3.0 许可协议

您可以使用 @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";
  }

}

原文由 Yogi 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题