Ayush Srivastava
Ayush Srivastava

Reputation: 474

Consider defining a bean of type 'com.repository.UserRepository' in your configuration

Hi I am doing JPA and Hibernate configuration using Java configuration in spring boot and I am stuck it at this error for hours. Even though I have declared the UserRepository as bean still it is not able to get the repository.

package com.repository;

@Repository
public interface UserRepository extends JpaRepository<User, Long> {}

My service class which is using this repository:

package com.service;

@Service
public class AppointmentPaymentServiceImpl implements AppointmentPaymentService {

@Autowired
private UserRepository userRepository;
......
......
}

My Database configuration:

package com.config;

@Configuration
@PropertySource(value = { "classpath:application.properties" })
@EnableTransactionManagement
@EnableJpaRepositories("com.repository.*")
@EnableAutoConfiguration(exclude = {DataSourceAutoConfiguration.class,HibernateJpaAutoConfiguration.class})
public class DBConfig {

@Value("${spring.datasource.driver-class-name}")
public String driver;

@Value("${spring.datasource.url}")
public String url;

@Value("${spring.datasource.username}")
public String username;

@Value("${spring.datasource.password}")
public String password;

@Value("${spring.jpa.properties.hibernate.dialect}")
public String dialect;

@Value("${spring.jpa.hibernate.ddl-auto}")
public String ddl;

@Bean(name = "dataSource")
public DriverManagerDataSource dataSource() {
    DriverManagerDataSource dataSource = new DriverManagerDataSource();
    dataSource.setDriverClassName(driver);
    dataSource.setUrl(url);
    dataSource.setUsername(username);
    dataSource.setPassword(password);

    return dataSource;
}


@Bean(name = "sessionFactory")
public LocalSessionFactoryBean hibernateSessionFactory(DataSource dataSource) {
    LocalSessionFactoryBean sessionFactory = new LocalSessionFactoryBean();
    sessionFactory.setDataSource(dataSource());
    sessionFactory.setPackagesToScan(new String[] { "com.model.*" });
    sessionFactory.setHibernateProperties(hibernateProperties());
    return sessionFactory;
}


@Bean
HibernateTransactionManager transactionManagerHib(SessionFactory sessionFactory) {
    HibernateTransactionManager transactionManager = new HibernateTransactionManager();
    transactionManager.setSessionFactory(sessionFactory);
    return transactionManager;
}

/*@Bean
@Qualifier(value = "entityManager")
public EntityManager entityManager(EntityManagerFactory entityManagerFactory) {
    return entityManagerFactory.createEntityManager();
}*/

@Bean
public PersistenceExceptionTranslationPostProcessor exceptionTranslation() {
    return new PersistenceExceptionTranslationPostProcessor();
}

@Bean
 public LocalContainerEntityManagerFactoryBean entityManagerFactory() {

HibernateJpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter();
 vendorAdapter.setDatabase(Database.MYSQL);
 vendorAdapter.setGenerateDdl(true);

 LocalContainerEntityManagerFactoryBean em = new LocalContainerEntityManagerFactoryBean();
 em.setDataSource(dataSource());
 em.setPackagesToScan("com.model.*");
em.setJpaVendorAdapter(vendorAdapter);
 em.setJpaProperties(hibernateProperties());

 return em;
}

@Bean
 public PlatformTransactionManager transactionManager(EntityManagerFactory emf){
 JpaTransactionManager transactionManager = new JpaTransactionManager();
 transactionManager.setEntityManagerFactory(emf);

 return transactionManager;
}

Properties hibernateProperties() {
    return new Properties() {
        {
            setProperty("hibernate.hbm2ddl.auto", ddl);
            setProperty("hibernate.connection.useUnicode", "true");
            setProperty("spring.jpa.hibernate.ddl-auto", ddl);
            setProperty("hibernate.dialect", dialect);
            setProperty("spring.jpa.properties.hibernate.dialect", dialect);
            setProperty("hibernate.globally_quoted_identifiers", "true");
            setProperty("hibernate.connection.CharSet", "utf8mb4");
            setProperty("hibernate.connection.characterEncoding", "utf8");

        }
    };
}

}

And this is my main class:

package com; 

@SpringBootApplication
@ComponentScan(basePackages = { "com.*"})
@EnableCaching
@Configuration
@PropertySource({"classpath:logging.properties"})
public class MainApplication {

public static void main(String[] args) {
    SpringApplication.run(MainApplication.class, args);
}

}

My pom.xml contains these dependencies for hibernate and jpa if I use only spring data jpa then hibernate-core 5.0.12.Final is imported by default which I do not want:

  <dependencies>
    <dependency>
        <groupId>org.springframework.data</groupId>
        <artifactId>spring-data-jpa</artifactId>
    </dependency>
    .
    .
    .
    <dependency>
        <groupId>org.hibernate</groupId>
        <artifactId>hibernate-core</artifactId>
        <version>5.2.10.Final</version>
    </dependency>

    <dependency>
        <groupId>org.hibernate</groupId>
        <artifactId>hibernate-entitymanager</artifactId>
        <version>5.2.3.Final</version>
    </dependency>
  </dependencies>

The error:

***************************
APPLICATION FAILED TO START
***************************

Description:

Field userRepository in com.service.AppointmentPaymentServiceImpl required a bean of type 'com.repository.UserRepository' that could not be found.


Action:

Consider defining a bean of type 'com.repository.UserRepository' in your configuration.

My User Entity:

package com.model;

@Entity
@Table(name = "USER")
@Data
@NoArgsConstructor
@AllArgsConstructor
public class User implements Serializable {

private static final long serialVersionUID = 1L;

@Id
@GeneratedValue
@Column(name = "id")
private Long id;

@NotNull
@Column(name = "city_id")
private Long cityId;

@Column(name = "name")
private String name;

@Column(name = "age")
private int age;

@Column(name = "locality")
private String locality;

@Column(name = "gender")
private String gender;

}

Upvotes: 24

Views: 89649

Answers (9)

Misbah Rahman
Misbah Rahman

Reputation: 38

The Repository package needs to be inside the main .com file (Along with services and controller)

Upvotes: 0

Vishal Bramhankar
Vishal Bramhankar

Reputation: 263

In the @ComponentScan("") add your respective package in which your annotated class present

package com.graphql.springboot;

@SpringBootApplication
@ComponentScan("com.graphql.springboot.repo")
public class GraphqlSpringbootApplication {

    public static void main(String[] args) {
        SpringApplication.run(GraphqlSpringbootApplication.class, args);
    }

}

your service class

package com.graphql.springboot.serviceImpl;

@Service
public class BookServiceImpl implements BookService {

    @Autowired
    BookRepo bookRepo;

    @Override
    public List<Book> getAll() {
        return bookRepo.findAll();
    }

}

your repository class

package com.graphql.springboot.repo;

@Repository
public interface BookRepo extends JpaRepository<Book, Integer> {
}

Upvotes: 0

Pradeep Agrawal
Pradeep Agrawal

Reputation: 346

It's because you are using Spring Data JPA.

<dependency>
    <groupId>org.springframework.data</groupId>
    <artifactId>spring-data-jpa</artifactId>
</dependency>

Replace it with Spring Boot Starter Data JPA. It has all the necessary dependencies to fix the repository loading issue.

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>

Upvotes: 4

Dhawal Kamdar
Dhawal Kamdar

Reputation: 131

Add any one of the following annotations to the main class of your spring boot application. Both of them worked for me.

@ComponentScan("com.abc.repository")
@EnableAutoConfiguration

Upvotes: 0

Jilson P Jose
Jilson P Jose

Reputation: 61

I had the same problem. I just copied the repositories from my working project to a new project and I got the same error consider defining a bean of type com.[packagename].repository.[repository-name]. Nothing above worked for me and later I did the following things:

  1. Removed the version of JPA dependancy in POM file (just removed the version tag)

  2. I was using Java 15 and when I created the SpringBoot project from start.spring.io, there was only 11 and 16 fava versions. So I selected 11 for my project. I changed that too in POM file

    15 (it was 11 before)
  3. Now I removed the @ComponentScan annotation in my main file, which was also a solution worked for me early.

  4. Just invalidate the cache and restart

  5. Type mvn clean install

  6. mvn clean spring-boot:run Hope this work for you too

Upvotes: 0

MonirRouissi
MonirRouissi

Reputation: 631

Just put AppointmentPaymentServiceImpl and UserRepository in the same package which for me was com.

Upvotes: 1

jayesh
jayesh

Reputation: 921

Adding the following annotation in the main spring boot application class solved the issue in my case:

@ComponentScan("com.myapp.repositories")

Upvotes: 29

lakshmanvvs
lakshmanvvs

Reputation: 81

I think your code has to be organized under com.xyz.abc.model and the @EnableJpaRepostiories should work. eg: com.xyz.abc.repository, com.xyz.abc.service

Upvotes: 2

akourt
akourt

Reputation: 5563

Your @EnableJpaRepositories annotation is wrong. You don't define the package where the repositories are found this way.

Assuming that the package they reside is called:

foo.somepackage.repositories then you annotation should be @EnableJpaRepositories("foo.somepackage.repositories").

Try correcting the annotation in order to properly and correctly scan your repositories package in order to bring them into context.

Upvotes: 13

Related Questions