Имя службы Spring конфликтует с именем интерфейса
У меня есть имя интерфейса
public interface ScoreDao {
public int storeScore(OverallScore overallScore);
public void storeIndividualScore(ScoreTO scoreTO);
}
Класс реализации как ниже
@Repository("scoreDao")
public class ScoreDaoImpl implements ScoreDao {
@Override
public int storeScore(OverallScore overallScore) {
//Implementation
}
@Override
public void storeIndividualScore(ScoreTO scoreTO){
//Implementation
}
}
Абонент использует сервис, как показано ниже
@Service("scoreService")
public class scoreServiceImpl implements IScoreService {
@Autowired
private ScoreDao scoreDao;
@Override
public int storeScore(OverallScore overallScore) {
return scoreDao.storeOverallScore(overallScore);
}
@Override
public void storeIndividualScore(ScoreTO scoreTO) {
scoreDao.storeIndividualScore(scoreTO);
}
}
Я использую Spring 4.x, при развертывании я получаю ошибку конфликта компонентов, как показано ниже.
Причина: java.lang.RuntimeException: org.springframework.context.annotation.ConflictingBeanDefinitionException: указанное в аннотации имя компонента 'ScoreDao' для класса компонента [ScoreDao] конфликтует с существующим, несовместимым определением компонента с тем же именем и классом [ScoreDaoImpl]
Когда я меняю имя интерфейса на IScoreDao, оно работает. Это из-за того, что имя службы @Repository("scoreDao") совпадает с именем интерфейса?
2 ответа
Ответ прост: да, это связано с тем, что у вас есть интерфейс ScoreDao
и вы делаете реализацию этого как @Repository("scoreDao")
два способа решить это:
переименовывать
ScoreDao
на другое имя+ Изменить
@Repository("scoreDao")
в@Repository
так что он будет использовать имя по умолчанию
Есть еще одно решение упоминания @Repository в вашем интерфейсе, так что вам не нужно упоминать о своем классе реализации, потому что вы реализуете этот интерфейс. поэтому он создает бин автоматически с именем интерфейса.