簡體   English   中英

使用EntityManager的Spring數據:NullPointerException

[英]Spring data using EntityManager: NullPointerException

我是春季數據的新手。 我正在嘗試使用spring數據和entitymanager構建一個小的Java應用程序。 該項目的結構如下:

在此處輸入圖片說明

對於spring配置,我創建了一個類,並在該類中定義了bean,該bean將用於以這種方式創建實體管理器bean

SpringConfiguration:

@Configuration
@EnableTransactionManagement
@PropertySource({ "classpath:persistence-mysql.properties" })
@ComponentScan({ "com.spring.data.persistence" })
public class SpringConfiguration implements TransactionManagementConfigurer{

    @Autowired
    private Environment env;

    @Bean
    public DataSource dataSource() {
        DriverManagerDataSource driverManagerDataSource = new DriverManagerDataSource();

        driverManagerDataSource.setDriverClassName(env.getProperty("jdbc.driverClassName"));
        driverManagerDataSource.setUrl(env.getProperty("jdbc.url"));
        driverManagerDataSource.setUsername(env.getProperty("jdbc.user"));
        driverManagerDataSource.setPassword(env.getProperty("jdbc.pass"));
        return driverManagerDataSource;
    }

    @Bean
    public LocalContainerEntityManagerFactoryBean entityManagerFactory() {
        LocalContainerEntityManagerFactoryBean localContainerEntityManagerFactoryBean = new LocalContainerEntityManagerFactoryBean();
        localContainerEntityManagerFactoryBean.setDataSource(dataSource());
        localContainerEntityManagerFactoryBean.setJpaDialect(jpaDialect());
        localContainerEntityManagerFactoryBean.setPackagesToScan(new String[] { "com.spring.data.persistence.model" });
        localContainerEntityManagerFactoryBean.setJpaVendorAdapter(jpaAdapter());
        return localContainerEntityManagerFactoryBean;
    }

    @Bean
    public HibernateJpaVendorAdapter jpaAdapter() {
        HibernateJpaVendorAdapter hibernateJpaVendorAdapter = new HibernateJpaVendorAdapter();
        Boolean showSql = true;
        hibernateJpaVendorAdapter.setShowSql(showSql);
        hibernateJpaVendorAdapter.setDatabasePlatform(env.getProperty("hibernate.dialect"));
        hibernateJpaVendorAdapter.setGenerateDdl(false);
        return hibernateJpaVendorAdapter;
    }

    @Bean
    public JpaDialect jpaDialect() {
        return new HibernateJpaDialect();
    }

    @Bean
    public PersistenceExceptionTranslationPostProcessor persistenceExceptionTranslationPostProcessor() {
        PersistenceExceptionTranslationPostProcessor persistenceExceptionTranslationPostProcessor = new PersistenceExceptionTranslationPostProcessor();
        persistenceExceptionTranslationPostProcessor.setRepositoryAnnotationType(Repository.class);
        return persistenceExceptionTranslationPostProcessor;
    }

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

    @Bean
    public PlatformTransactionManager annotationDrivenTransactionManager() {
        return transactionManager();
    }

}

為了能夠訪問數據庫,我創建了DAO類UserDao,該類僅允許在表User中創建一行。

接口IUserDao

public interface IUserDao {
    public User create(User user);
}

UserDao類

@Repository
public class UserDao implements IUserDao{

    @PersistenceContext
    private EntityManager entityManager;

    public UserDao()
    {
        super();
    }
    public User create(User user) {
        try {
            this.entityManager.persist(user);
            return user;
        } catch (PersistenceException ex) {
            ex.printStackTrace();
            return null;

        } catch (IllegalArgumentException ex) {
            ex.printStackTrace();
            return null;
        }
    }

}

這就是用戶的實體類:

用戶實體

@Entity
public class User {
    @Id
    @GeneratedValue
    @Column(name="USER_ID")
    private int id;

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

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

這是對完成情況的一個小測試

考試

public class UserTest {

    @Autowired
    UserDao userDao;

    @Test
    public void test() {
        User user=new User();
        user.setName("User1");
        userDao.create(user);
    }

}

但是問題是,如果我運行主程序,則會得到NullPointerException異常,因為userDao的值為null,因此未定義UserDao Bean。 我的工作有什么問題?

在您的主要方法中,您嘗試自動連接靜態的東西。 那是行不通的。 請參閱此處的詳細說明。

有關如何使用Spring進行單元測試的全面文檔,請閱讀此處的文檔

您正在嘗試在更簡單的標准環境中測試Spring企業環境。 企業環境需要先進行一些設置,然后才能為您工作。 一個很好的起點是http://docs.spring.io/spring/docs/current/spring-framework-reference/html/integration-testing.html

一旦正確放置了部件,構建和測試就變得非常容易和有趣。

然后,您應該從junit類初始化Spring Context。 您發布的代碼沒有顯示此內容,因此空指針可能是由於此錯誤引起的。

public class UserTest {

    @Autowired
    UserDao userDao;

    @Test
    public void test() {
        User user=new User();
        user.setName("User1");
        userDao.create(user);
    }

}

您應該使用類似以下內容注釋類UserTest:

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = SpringConfiguration.class, loader = AnnotationConfigContextLoader.class)
public class UserTest {
    @Autowired
    UserDao userDao;

    @Test
    public void test() {
        User user=new User();
        user.setName("User1");
        userDao.create(user);
    }

}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM