Java 没有MailProcessor类型的合格bean';可用:应为单个匹配bean,但找到2:AwsService,服务

Java 没有MailProcessor类型的合格bean';可用:应为单个匹配bean,但找到2:AwsService,服务,java,spring,spring-boot,Java,Spring,Spring Boot,我想实现Java代码,它根据我发送的键或对象调用实现类/服务。我试过这个: public interface MailProcessor { void processCreateUserMessage(CreateUserDTO createUserDTO); } public interface EmailRestService { void processCreateUserMessage(CreateUserDTO createUserDTO); } @Servi

我想实现Java代码,它根据我发送的键或对象调用实现类/服务。我试过这个:

public interface MailProcessor {

    void processCreateUserMessage(CreateUserDTO createUserDTO);
} 

public interface EmailRestService {

    void processCreateUserMessage(CreateUserDTO createUserDTO);
}

@Service
public class EmailRestServiceImpl implements EmailRestService {

    private MailProcessor defaultProcessor;
    private Map<String, MailProcessor> processors;
    private String provider = "AwsService";

    @Autowired
    public EmailRestServiceImpl(MailProcessor defaultProcessor,
                           Map<String, MailProcessor> processors) {
        this.defaultProcessor = defaultProcessor;
        this.processors = processors;
    }

    @Override
    public void processCreateUserMessage(CreateUserDTO createUserDTO)
    {
        MailProcessor messageProcessor = processors.getOrDefault(provider, defaultProcessor);
        messageProcessor.processCreateUserMessage(createUserDTO);
    }
}
但在启动过程中,我会遇到以下异常:

org.springframework.beans.factory.NoUniqueBeanDefinitionException: No qualifying bean of type 'org.engine.service.MailProcessor' available: expected single matching bean but found 2: AwsService,ChimpjetService
        at org.springframework.beans.factory.config.DependencyDescriptor.resolveNotUnique(DependencyDescriptor.java:220)

您能告诉我如何正确实现此代码吗:

您需要将其中一个标记为@Primary。这将告诉Spring默认情况下选择哪一个,如果选择哪一个之间存在冲突。例如,如果您有一个类需要“MailProcessor”依赖项,但没有通过将变量命名为“chimpService”或使用“@Qualifier”来限定它。然后它将使用您标记的“@Primary”作为默认值。

谢谢。你能和我分享一些更好的设计吗?这不是我脑子里想的。我只会标记其中一个可能会被更多地用作主要的一个。不过,哪一个是主要的并不重要,因为我建议始终限定变量以获得正确的注入依赖项,以便更容易地看到发生了什么。作为建议,我将删除“@Component”中的名称。默认情况下,如果将要注入的变量命名为与要注入的类类型相同的变量,则只需将变量命名为与类相同的字段格式,以便第一个字母为小写,然后是正常大小写。Spring将自动将正确的bean与正确的字段连接起来,并删除冗余和执行“@Qualifiers”的需要,因为您是通过要注入的字段的名称来限定它的。
org.springframework.beans.factory.NoUniqueBeanDefinitionException: No qualifying bean of type 'org.engine.service.MailProcessor' available: expected single matching bean but found 2: AwsService,ChimpjetService
        at org.springframework.beans.factory.config.DependencyDescriptor.resolveNotUnique(DependencyDescriptor.java:220)