@yung_filosof

Почему не создается бин jpaRepository?

Первый раз деплою. через идею все нормально отрабатывает, но при попытке задеплоить на vps выдает ошибку, гитхаб проект
Стекрейс ошибки:
[main] WARN org.springframework.context.annotation.AnnotationConfigApplicationContext - Exception encountered during context initialization - cancel        ling refresh attempt: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'bot' defined in URL [jar:file:/root/Telegr        am.jar!/com/nikita/bot/Bot.class]: Unsatisfied dependency expressed through constructor parameter 0; nested exception is org.springframework.beans.factory.Unsati        sfiedDependencyException: Error creating bean with name 'channelService' defined in URL [jar:file:/root/Telegram.jar!/com/nikita/service/ChannelService.class]: U        nsatisfied dependency expressed through constructor parameter 0; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean         with name 'jpaChannelRepository' defined in com.nikita.repository.JpaChannelRepository defined in @EnableJpaRepositories declared on App: Cannot create inner be        an '(inner bean)#3382f8ae' of type [org.springframework.orm.jpa.SharedEntityManagerCreator] while setting bean property 'entityManager'; nested exception is org.        springframework.beans.factory.BeanCreationException: Error creating bean with name '(inner bean)#3382f8ae': Cannot resolve reference to bean 'entityManagerFactor        y' while setting constructor argument; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named 'entityManagerFactory'         available
21:43:19.367 [main] ERROR org.springframework.boot.SpringApplication - Application run failed
org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'bot' defined in URL [jar:file:/root/Telegram.jar!/com/nikita/bot        /Bot.class]: Unsatisfied dependency expressed through constructor parameter 0; nested exception is org.springframework.beans.factory.UnsatisfiedDependencyExcepti        on: Error creating bean with name 'channelService' defined in URL [jar:file:/root/Telegram.jar!/com/nikita/service/ChannelService.class]: Unsatisfied dependency         expressed through constructor parameter 0; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'jpaChannel        Repository' defined in com.nikita.repository.JpaChannelRepository defined in @EnableJpaRepositories declared on App: Cannot create inner bean '(inner bean)#3382f        8ae' of type [org.springframework.orm.jpa.SharedEntityManagerCreator] while setting bean property 'entityManager'; nested exception is org.springframework.beans.        factory.BeanCreationException: Error creating bean with name '(inner bean)#3382f8ae': Cannot resolve reference to bean 'entityManagerFactory' while setting const        ructor argument; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named 'entityManagerFactory' available

ChannelService:
import com.nikita.model.Channel;
import com.nikita.repository.JpaChannelRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;

@Service
public class ChannelService {

    private final JpaChannelRepository jpaChannelRepository;

    @Autowired
    public ChannelService(JpaChannelRepository jpaChannelRepository) {
        this.jpaChannelRepository = jpaChannelRepository;
    }


    public List<Channel> findByStart(boolean start){
        return jpaChannelRepository.findAllByStart(start);
    }

    public Channel update(Channel channel){
        return jpaChannelRepository.save(channel);
    }

    public void delete(String id){
        jpaChannelRepository.deleteById(id);
    }

    public List<Channel> findAll(){
        return jpaChannelRepository.findAll();
    }

    public Channel findById(String id){
        return jpaChannelRepository.findById(id).get();
    }
}


JpaChannelRepository:
package com.nikita.repository;

import com.nikita.model.Channel;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;
import org.springframework.stereotype.Repository;

import java.util.List;
import java.util.Optional;

@Repository
public interface JpaChannelRepository extends JpaRepository<Channel, String> {

    @Override
    Optional<Channel> findById(String id);

    @Query("SELECT c FROM Channel c WHERE c.start=:start")
    List<Channel> findAllByStart(@Param("start") boolean start);

    @Override
    <S extends Channel> S save(S s);

    @Override
    void deleteById(String id);


}


Сам пытался понять в чем проблема весь день, ни 1 из способов, найденных в интернете не помог..
  • Вопрос задан
  • 4324 просмотра
Пригласить эксперта
Ответы на вопрос 2
xez
@xez
TL Junior Roo
Похоже, что у вас не хватает бина "entityManagerFactory":
No bean named 'entityManagerFactory' available

Попробуйте его где-нибудь объявить.
Ответ написан
Комментировать
azerphoenix
@azerphoenix Куратор тега Spring
Java Software Engineer
Здравствуйте!
Удалось ли вам решить проблему?
Если нет, то поделюсь некоторыми мыслями, а вы уже продебажьте ваш код.
Первый раз деплою. через идею все нормально отрабатывает, но при попытке задеплоить на vps выдает ошибку

Если у вас локально отрабатывает корректно, а на VPS нет, то проверьте конфигурацию сервера. В вашем проекте на гитхаб application.yaml пустой и соответственно, непонятно что именно у вас прописано в конфигах для production. Если у вас есть профили, то проверьте установлен ли hibernate.ddl-auto: validate и если установлен, то импортировали ли вы ddl & dml на сервер. Или у вас он на production должен создать ddl сам?
Как минимум, это первый момент на что стоит обратить внимание.

Далее стоит уточнить деплоите ли вы приложение на внешний томкат или используете embedded?
Далее попробуйте добавить такой класс в ваш проект:

public class ServletInitializer extends SpringBootServletInitializer {

  @Override
  protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
    return application.sources(App.class);
  }
}


Далее обратите внимание на то, как именно вы собираете build и что в него добавляете. Например, war exploded или war или jar. Есть ли все необходимые классы в нем и т.д.

Если сборка происходит через Gradle, то используйте bootWar. В общем, нужно проводить дебаг и смотреть что не так
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы