1

我收到以下错误 创建名为“genericRepository”的 bean 时出错:FactoryBean 在创建对象时抛出异常;嵌套异常是 java.lang.IllegalArgumentException: Not an managed type: class java.lang.Object

我是泛型新手,如果有任何泛型问题,请告诉我

我的 Contact.java 在 com.merc.template.managelistofobjects.domain 包中所有其他类都在 com.merc.template.managelistofobjects 包中

ContactCollectionManagerImpl

@Component
public class ContactCollectionManagerImpl extends CollectionManagerImpl<Contact> implements CollectionManager<Contact>{

@Autowired
private GenericRepository<Contact,Long> genericRepository;

public ContactCollectionManagerImpl() {
    setGenericRepository(genericRepository);
}

@Override
public void addToCollection(Contact contact, boolean reload){
    super.addToCollection(contact, entityDataMap, reload);
}
}

CollectionManagerImpl

public abstract class CollectionManagerImpl<T extends EntityBean> implements CollectionManager<T>{

private GenericRepository objectManager;

public void setGenericRepository(GenericRepository genericRepository) {
    this.objectManager = genericRepository;
}

protected void addToCollection(T entity, Map<Long,T> entityDataMap, boolean reload) {
    //reload is set to false when the static map needs not be updated
    if(reload){
        //loads all the existing collection objects from db
        loadCollection(entityDataMap, false);

        //check if the obect to be inserted already exists in collection
        if(entityDataMap.containsKey(entity.getId())){
            return;
        }
    }

    //TODO save to database
    objectManager.save(entity);

    if(reload){
        syncCollectionWithDB(entityDataMap);
    }
}
}

集合管理器

public interface CollectionManager<T> {

public void addToCollection(T object, boolean reload);
}

通用存储库

public interface GenericRepository<T, ID extends Long> extends JpaRepository<T, ID>{

}

我的应用程序上下文

@Configuration
@EnableJpaRepositories
@ComponentScan("com.merc.template.managelistofobjects")
@ImportResource("classpath:spring/app-context.xml")
@PropertySource("classpath:application.properties")
public class MyApplicationContext {

private static final String PROPERTY_NAME_DATABASE_DRIVER = "db.driver";
private static final String PROPERTY_NAME_DATABASE_PASSWORD = "db.password";
private static final String PROPERTY_NAME_DATABASE_URL = "db.url";
private static final String PROPERTY_NAME_DATABASE_USERNAME = "db.username";

private static final String PROPERTY_NAME_HIBERNATE_DIALECT = "hibernate.dialect";
private static final String PROPERTY_NAME_HIBERNATE_FORMAT_SQL = "hibernate.format_sql";
private static final String PROPERTY_NAME_HIBERNATE_NAMING_STRATEGY = "hibernate.ejb.naming_strategy";
private static final String PROPERTY_NAME_HIBERNATE_SHOW_SQL = "hibernate.show_sql";
private static final String PROPERTY_NAME_ENTITYMANAGER_PACKAGES_TO_SCAN = "entitymanager.packages.to.scan";

@Resource
private Environment environment;

@Bean
public DataSource dataSource() {
    BoneCPDataSource dataSource = new BoneCPDataSource();

    dataSource.setDriverClass(environment.getRequiredProperty(PROPERTY_NAME_DATABASE_DRIVER));
    dataSource.setJdbcUrl(environment.getRequiredProperty(PROPERTY_NAME_DATABASE_URL));
    dataSource.setUsername(environment.getRequiredProperty(PROPERTY_NAME_DATABASE_USERNAME));
    dataSource.setPassword(environment.getRequiredProperty(PROPERTY_NAME_DATABASE_PASSWORD));

    return dataSource;
}

@Bean
public JpaTransactionManager transactionManager() throws ClassNotFoundException {
    JpaTransactionManager transactionManager = new JpaTransactionManager();

    transactionManager.setEntityManagerFactory(entityManagerFactoryBean().getObject());

    return transactionManager;
}

@Bean
public LocalContainerEntityManagerFactoryBean entityManagerFactoryBean() throws ClassNotFoundException {
    LocalContainerEntityManagerFactoryBean entityManagerFactoryBean = new LocalContainerEntityManagerFactoryBean();

    entityManagerFactoryBean.setDataSource(dataSource());
    //setPackagesToScan = com.merc.template.managelistofobjects.domain 
entityManagerFactoryBean.setPackagesToScan(environment.getRequiredProperty(PROPERTY_NAME_ENTITYMANAGER_PACKAGES_TO_SCAN));
    entityManagerFactoryBean.setPersistenceProviderClass(HibernatePersistence.class);

    Properties jpaProterties = new Properties();
    jpaProterties.put(PROPERTY_NAME_HIBERNATE_DIALECT, environment.getRequiredProperty(PROPERTY_NAME_HIBERNATE_DIALECT));
    jpaProterties.put(PROPERTY_NAME_HIBERNATE_FORMAT_SQL, environment.getRequiredProperty(PROPERTY_NAME_HIBERNATE_FORMAT_SQL));
    jpaProterties.put(PROPERTY_NAME_HIBERNATE_NAMING_STRATEGY, environment.getRequiredProperty(PROPERTY_NAME_HIBERNATE_NAMING_STRATEGY));
    jpaProterties.put(PROPERTY_NAME_HIBERNATE_SHOW_SQL, environment.getRequiredProperty(PROPERTY_NAME_HIBERNATE_SHOW_SQL));

    entityManagerFactoryBean.setJpaProperties(jpaProterties);

    return entityManagerFactoryBean;
}

@Bean
public CollectionManager contactCollectionManager(){
    return new ContactCollectionManagerImpl();
}

}

我的主类包含以下代码

ApplicationContext context = new AnnotationConfigApplicationContext(MyApplicationContext.class);
    CollectionManager collMgr = context.getBean("contactCollectionManager",CollectionManager.class);
    Contact contact = new Contact(2L,"xyz","abc");
    collMgr.addToCollection(contact, true);

entitymanager.packages.to.scan=com.merc.template.managelistofobjects.domain

我的 spring xml 文件只包含一行

<jpa:repositories base-package="com.merc.template.managelistofobjects"/>

当我运行代码时,我收到以下错误 java.lang.IllegalArgumentException: Not an managed type: class java.lang.Object

4

1 回答 1

1

您不能自动装配采用泛型类型的对象,您必须定义一个强类型的子接口,GenericRepository然后在您的类中自动装配它

public interface ContactGenericRepository extends GenericRepository<Contact,Long> {}

然后自动装配新接口

@Autowired
private ContactGenericRepository contractGenericRepository;

PS:您不能在包装它的类的构造函数中使用自动装配的对象,就像您在ContactCollectionManagerImpl构造函数中所做的那样,因为该对象尚未实例化

您可以轻松地使用@PostConstruct任何其他执行您想要的行为的方法,就像这样

@PostConstruct
public void populateContactCollectionManagerImpl() {
   setGenericRepository(genericRepository);
}
于 2013-09-11T00:10:53.787 回答