Найдено несколько бобов - требуется только один - PullRequest
0 голосов
/ 12 апреля 2020

Я знаю, что это частый вопрос, но я действительно не могу понять, в чем проблема с моим кодом и почему Spring по-прежнему говорит, что есть несколько бинов, даже если я уже определил @ Qualifiers.

Для параметра 0 конструктора в br.com.mercados.database_syn c .DatabaseSyncStrategyImpl требуется один компонент, но найдено 2: - databaseSyncDelegateCompra: определено в файле [C: \ Users \ test \ git \ webservice_compras \ target \ classes \ br \ com \ mercados \ database_sync \ DatabaseSyncDelegateCompra.class] - databaseSyncDelegateProduto: определено в файле [C: \ Users \ test \ git \ webservice_compras \ target \ classes \ br \ com \ mercados \ database_sync \ DatabaseSyncDelegateto. 1004 *

package br.com.mercados.configuration;
import br.com.mercados.database_sync.DatabaseSyncDelegateCompra;
import br.com.mercados.database_sync.DatabaseSyncDelegateProduto;
import br.com.mercados.database_sync.DatabaseSyncStrategy;
import br.com.mercados.database_sync.DatabaseSyncStrategyImpl;
import br.com.mercados.model.Compra;
import br.com.mercados.model.Produto;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class DatabaseSyncStrategyConfig {

    @Bean(name = "databaseSyncStrategyCompra")
    public DatabaseSyncStrategy<Compra, Compra> databaseSyncStrategyCompra(DatabaseSyncDelegateCompra databaseSyncDelegateCompra) {
        return new DatabaseSyncStrategyImpl<>(databaseSyncDelegateCompra);
    }

    @Bean(name = "databaseSyncStrategyProduto")
    public DatabaseSyncStrategy<Produto, Produto> databaseSyncStrategyProduto(DatabaseSyncDelegateProduto databaseSyncDelegateProduto) {
        return new DatabaseSyncStrategyImpl<>(databaseSyncDelegateProduto);
    }
}

package br.com.mercados.database_sync;

import java.util.List;

public interface DatabaseSyncStrategy<T, V> {

    void setNewObjectsList(List<T> newObjects);
    void setPersistedObjectsList(List<V> persistedObjects);
    void updateDatabase();

    interface DatabaseSyncDelegate<T, V> {
        void save(T newObject);
        void update(T newObject, V persistedObject);
        void delete(V persistedObject);
    }
}

package br.com.mercados.database_sync;

import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.lang.NonNull;
import org.springframework.stereotype.Component;

import java.util.List;

@Component
public class DatabaseSyncStrategyImpl<T, V> implements DatabaseSyncStrategy<T, V> {

    private DatabaseSyncDelegate<T, V> delegate;
    private List<T> newObjects;
    private List<V> persistedObjects;

    public DatabaseSyncStrategyImpl(@NonNull DatabaseSyncDelegate<T, V> delegate) {
        this.delegate = delegate;
    }

    @Override
    public void setNewObjectsList(List<T> newObjects) {
        this.newObjects = newObjects;
    }

    @Override
    public void setPersistedObjectsList(List<V> persistedObjects) {
        this.persistedObjects = persistedObjects;
    }

    @Override
    public void updateDatabase() {
        for (T currentNewObject : newObjects) {
            int indexOf = persistedObjects.indexOf(currentNewObject);
            if (indexOf >= 0) {
                //Objeto que existe na base local e na base remota
                this.delegate.update(currentNewObject, persistedObjects.get(indexOf));
            } else {
                //Objeto que existe na base remota mas nao existe na base local
                this.delegate.save(currentNewObject);
            }
        }
    }
}

И меня зовут так в двух классах гнезда.

package br.com.mercados.controllers;

import java.util.Calendar;
import java.util.List;

import br.com.mercados.database_sync.DatabaseSyncDelegateProduto;
import br.com.mercados.database_sync.DatabaseSyncStrategy;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Service;

import br.com.mercados.model.Compra;
import br.com.mercados.model.Produto;
import br.com.mercados.repository.ProdutoRepository;

@Service
public class ProdutoController {

    @Autowired
    ProdutoRepository produtoRepository;

    @Autowired
    DatabaseSyncDelegateProduto databaseSyncDelegateProduto;

    @Autowired
    @Qualifier("databaseSyncStrategyProduto")
    private DatabaseSyncStrategy<Produto, Produto> databaseSyncStrategy;

    ....

package br.com.mercados.database_sync;

    import br.com.mercados.controllers.ProdutoController;
    import br.com.mercados.model.Compra;
    import br.com.mercados.model.Produto;
    import br.com.mercados.repository.ComprasRepository;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.beans.factory.annotation.Qualifier;
    import org.springframework.stereotype.Component;

    import java.util.ArrayList;

        @Component()
        public class DatabaseSyncDelegateProduto implements DatabaseSyncStrategy.DatabaseSyncDelegate<Produto,Produto> {

            @Autowired
            private ProdutoController produtoController;

            @Autowired
            private ComprasRepository compraDao;

            @Autowired
            private DatabaseSyncDelegateCompra databaseSyncDelegateCompra;

            @Autowired
            @Qualifier("databaseSyncStrategyCompra")
            private DatabaseSyncStrategy<Compra, Compra> databaseSyncStrategyCompra;
        ....

package br.com.mercados.database_sync;

import java.util.List;

public interface DatabaseSyncStrategy<T, V> {

    void setNewObjectsList(List<T> newObjects);
    void setPersistedObjectsList(List<V> persistedObjects);
    void updateDatabase();

    interface DatabaseSyncDelegate<T, V> {
        void save(T newObject);
        void update(T newObject, V persistedObject);
        void delete(V persistedObject);
    }
}
...