Spring Data: Not an managed type: class java.lang.Object

20,226

That's not possible the way you are trying. Since T needs to be an Entity, you need to type-restrict it. One option would be to make one repository per concrete Entity, but here you have a more generic way of implementing it:

Use a BaseClass for your entities:

@Entity
public abstract class BaseClass<IdType extends Serializable>{

    private IdType id;

    //Getter and setters

}

Define a @Repository for your base class:

@Repository
public interface Dao<T extends BaseClass, IdType extends Serializable> extends
        CrudRepository<T, IdType> {

}

You can define the shared entity operations in this interface and inherit from them for more concrete ones in the cases demanding it.

See also:

Share:
20,226
Em Ae
Author by

Em Ae

Updated on August 01, 2022

Comments

  • Em Ae
    Em Ae almost 2 years

    I am trying to expose my db tables via spring boot by following different spring tutorials and I am running into following exception (I will post exception at the end).

    Here are the classes that I am using

    package com.xxx.xxx.db;
    
    import org.springframework.data.repository.Repository;
    
    import java.io.Serializable;
    
    public interface BaseRepository<T, ID extends Serializable> extends Repository<T, ID>{
      T findOne(ID id);
      T save(T entity);
    }
    

    And here is my specific service class

    package com.xxx.xxx.tablename;
    
    import com.xxx.xxx.db.BaseRepository;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.stereotype.Service;
    
    @Service
    public class TableNameService {
    
      @Autowired
      private BaseRepository<TableName, Long> repository;
    
      public TableName findById(Long id){
        return repository.findOne(id);
      }
    }
    

    and here is my entity

    package com.xxx.xxx.tablename;
    
    import lombok.Getter;
    import lombok.Setter;
    
    import javax.persistence.Entity;
    import javax.persistence.Id;
    import javax.persistence.Table;
    import javax.validation.constraints.NotNull;
    
    @Getter
    @Setter
    @Entity
    @Table(name="table_name")
    public class TableName {
    
      @Id
      private long id;
    
      @NotNull
      private String name;
    
      public TableName() {
      }
    
      public TableName(long id){
        this.id = id;
      }
    
      public TableName(String name){
        this.name = name;
      }
    
      public TableName(long id, String name){
        this.id = id;
        this.name = name;
      }
    }
    

    My spring configurations are being done by application.yml file. The file currently have only database connection informaiton and nothing more than that

    I also have a class named BeansConfig which is annotated by @Configuration. But this class is being used to validate if db properties which are being provided by application.yml are valid.

    And now here is the exception

    springframework.beans.factory.BeanCreationException: Error creating bean with name 'TableNameService': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: private com.xxx.xxx.db.BaseRepository com.xxx.xxx.tablename.TableNameService.repository; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'baseRepository': Invocation of init method failed; nested exception is java.lang.IllegalArgumentException: Not an managed type: class java.lang.Object
        at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:334)
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1214)
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:543)
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:482)
        at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:306)
        at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230)
        at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:302)
        at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:197)
        at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:772)
        at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:839)
        at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:538)
        at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.refresh(EmbeddedWebApplicationContext.java:118)
        at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:766)
        at org.springframework.boot.SpringApplication.createAndRefreshContext(SpringApplication.java:361)
        at org.springframework.boot.SpringApplication.run(SpringApplication.java:307)
        at org.springframework.boot.SpringApplication.run(SpringApplication.java:1191)
        at org.springframework.boot.SpringApplication.run(SpringApplication.java:1180)
        at com.xxx.xxx.Application.main(Application.java:12)
    Caused by: org.springframework.beans.factory.BeanCreationException: Could not autowire field: private com.xxx.xxx.db.BaseRepository com.xxx.xxx.tablename.TableNameService.repository; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'baseRepository': Invocation of init method failed; nested exception is java.lang.IllegalArgumentException: Not an managed type: class java.lang.Object
        at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:573)
        at org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:88)
        at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:331)
        ... 17 common frames omitted
    Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'baseRepository': Invocation of init method failed; nested exception is java.lang.IllegalArgumentException: Not an managed type: class java.lang.Object
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1578)
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:545)
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:482)
        at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:306)
        at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230)
        at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:302)
        at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:197)
        at org.springframework.beans.factory.support.DefaultListableBeanFactory.findAutowireCandidates(DefaultListableBeanFactory.java:1199)
        at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1116)
        at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1014)
        at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:545)
        ... 19 common frames omitted
    Caused by: java.lang.IllegalArgumentException: Not an managed type: class java.lang.Object
        at org.hibernate.jpa.internal.metamodel.MetamodelImpl.managedType(MetamodelImpl.java:219)
        at org.springframework.data.jpa.repository.support.JpaMetamodelEntityInformation.<init>(JpaMetamodelEntityInformation.java:68)
        at org.springframework.data.jpa.repository.support.JpaEntityInformationSupport.getEntityInformation(JpaEntityInformationSupport.java:67)
        at org.springframework.data.jpa.repository.support.JpaRepositoryFactory.getEntityInformation(JpaRepositoryFactory.java:152)
        at org.springframework.data.jpa.repository.support.JpaRepositoryFactory.getTargetRepository(JpaRepositoryFactory.java:99)
        at org.springframework.data.jpa.repository.support.JpaRepositoryFactory.getTargetRepository(JpaRepositoryFactory.java:81)
        at org.springframework.data.repository.core.support.RepositoryFactorySupport.getRepository(RepositoryFactorySupport.java:185)
        at org.springframework.data.repository.core.support.RepositoryFactoryBeanSupport.initAndReturn(RepositoryFactoryBeanSupport.java:251)
        at org.springframework.data.repository.core.support.RepositoryFactoryBeanSupport.afterPropertiesSet(RepositoryFactoryBeanSupport.java:237)
        at org.springframework.data.jpa.repository.support.JpaRepositoryFactoryBean.afterPropertiesSet(JpaRepositoryFactoryBean.java:92)
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1637)
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1574)
        ... 29 common frames omitted
    
    • lenach87
      lenach87 almost 8 years
      You can use already available repository interfaces of Spring Data - for example JpaRepository. Try creating a specific interface for your Table class - something like "TableRepository extends JpaRepository<Table, Long>" and annotate it with @Repository annotation.
    • chill appreciator
      chill appreciator about 2 years
      If you get this error trying to implement repository hierarchy, put @NoRepositoryBean annotation on your custom parent repository interface.
  • Em Ae
    Em Ae almost 8 years
    Thats something I would love to implement but for now, i am struggling to write a repo for specific class. I added a class TableNameGatewayRepo<TableName, ID extends Serializable> extends JpaRepoistory<PaymentGateway, ID> and I am still getting same error
  • Aritz
    Aritz almost 8 years
    Try TableNameGatewayRepo extends CrudRepository<PaymentGateway, Long> or the same way with Jpa instead of Crud