Bean 预计为“CourseDAO”类型,但实际上为“com.sun.proxy.$Proxy49”类型

问题描述 投票:0回答:1

在训练 Spring MVC + JPA/Hibernate 项目中,在更改配置后,我收到了相关错误。

原本DAO类是这样的:

public Course getById(Integer id) throws DAOException {
        Course result = null;
        try {
            EntityManager em = emf.getFactory().createEntityManager();
            result = em.find(Course.class, id);
        } catch (Exception e) {
            logger.error(e.getMessage(), e);
            throw new DAOException("Could not get Course By Id", e);
        }
        return result;
    }

我被告知要用 @PersistenceContext 生成

EntityManager
,并避免时不时地创建新的 EntityManager。所以我用
EntityManager em = ...
字段替换了上面的
@Autowired EntityManager em;
行,并更改了 JpaConfig 类,所以它看起来像:

@Configuration
@ComponentScan(basePackages = "com.example.school")
@PropertySource("classpath:database.properties")
@EnableTransactionManagement
public class JpaConfig {
    private final Environment environment;

    @Autowired
    public JpaConfig(Environment environment) {
        this.environment = environment;
    }

    @Autowired
    DataSource dataSource;
    
    @Bean
    public LocalContainerEntityManagerFactoryBean entityManagerFactory() throws NamingException {
        LocalContainerEntityManagerFactoryBean em = new LocalContainerEntityManagerFactoryBean();
        em.setDataSource(dataSource);
        em.setPackagesToScan("com.example.school");
        JpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter();
        em.setJpaVendorAdapter(vendorAdapter);
        return em;
    }

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

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

以前的配置文件就是这么简单:

@Configuration
public class EntityManagerConfig {
    EntityManagerFactory emf = Persistence.createEntityManagerFactory("PU");

    @Bean
    EntityManager em() {
        return emf.createEntityManager();
    }
}

现在我得到一个堆栈跟踪,其中包含以下最重要的问题:

org.springframework.beans.factory.UnsatisfiedDependencyException ...

...

引起:org.springframework.beans.factory.BeanNotOfRequiredTypeException:名为“courseDAO”的 Bean 预计为“com.example.school.dao.CourseDAO”类型,但实际上为“com.sun.proxy.$Proxy49”类型' 在org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1317)

此配置可能存在什么问题?

java spring jpa javabeans autowired
1个回答
0
投票

你为什么给你的豆子命名为

entityManagerFactory
?它可能会破坏其他依赖于 Hibernate 类型的 Bean
EntityManagerFactory
。例如将其重命名为
localContainerEntityManagerFactory

© www.soinside.com 2019 - 2024. All rights reserved.