Я знаю, что это частый вопрос, но я действительно не могу понять, в чем проблема с моим кодом и почему 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);
}
}