2013-09-10 3 views
1

Ошибка при создании Ошибка при создании bean с именем 'genericRepository': FactoryBean выбрал исключение для создания объекта; вложенное исключение составляет java.lang.IllegalArgumentException: Не является управляемый тип: класс 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); 
    } 
} 
} 

CollectionManager

public interface CollectionManager<T> { 

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

GenericRepository

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

} 

MyApplicationContext

@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

моя весна XML файл содержит только одну строку

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

Когда я запускаю код, который я получаю следующая ошибка java.lang.IllegalArgumentException: Не управляемый тип: class java.lang.Object

ответ

1

Вы не можете автоувеличивать объект, который использует общий тип, вам нужно будет определить строго типизированный под-интерфейс o е GenericRepository, а затем autowire его внутри clases

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

Затем autowire на новый интерфейс

@Autowired 
private ContactGenericRepository contractGenericRepository; 

PS: Вы не можете использовать autowired объект внутри конструктора класса, который обертывают его, как вы делаете внутри ContactCollectionManagerImpl конструктора, так как объект не

инстанцирован вы можете легко использовать @PostConstruct любой другой метод, который делает это поведение, которое вы хотите, как этот

@PostConstruct 
public void populateContactCollectionManagerImpl() { 
    setGenericRepository(genericRepository); 
} 
+0

Спасибо, попробуем его и вернемся к вам – user373201

+0

просто любопытно, должен ли я добавить интерфейс для каждого объекта. Я надеялся использовать общий dao для общих операций для большинства объектов. – user373201

+0

Если вы имеете в виду сущность, что она будет сохраняться в БД, то я думаю, что нет необходимости в интерфейсе для представления объекта, создайте класс напрямую. Для проблемы GenericDao, я думаю, что это все еще возможно, я предлагаю вам сделать его абстрактным классом.и вы могли бы по крайней мере реализовать все методы CRUD в нем с помощью дженериков, но вам нужно будет создать пустой DAO для каждого объекта и сделать его доступным из GenericDAO. Тогда вы можете добавить любые методы, которые вы хотите в нем – fujy

Смежные вопросы