Имя службы Spring конфликтует с именем интерфейса - PullRequest
0 голосов
/ 04 июня 2018

У меня есть имя интерфейса

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);
   }
}

IЯ использую Spring 4.x, при развертывании я получаю ошибку конфликта компонентов, как показано ниже.

Причина: java.lang.RuntimeException: org.springframework.context.annotation.ConflictingBeanDefinitionException: Annotation-указанное имя компонента 'ScoreDao' для класса компонента [ScoreDao] конфликтует с существующим несовместимым определением компонента с тем же именем и классом [ScoreDaoImpl]

Когда я изменяю имя интерфейса на IScoreDao, оно работает,Это из-за того, что имя службы @Repository ("scoreDao") совпадает с именем интерфейса?

Ответы [ 2 ]

0 голосов
/ 04 июня 2018

есть еще одно решение упоминания @Repository в вашем интерфейсе, так что вам не нужно упоминать о своем классе реализации, потому что вы реализуете этот интерфейс.поэтому он автоматически создает компонент с именем интерфейса.

0 голосов
/ 04 июня 2018

Простой ответ: Да . Это произошло из-за того, что у вас есть интерфейс с именем ScoreDao, и вы реализуете его как @Repository("scoreDao")

двумя способами для его решения.:

  1. Переименуйте ScoreDao в другое имя

  2. Измените @Repository("scoreDao") на @Repository, чтобы использовать имя по умолчанию

...