[英]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企業環境。 企業環境需要先進行一些設置,然后才能為您工作。 一個很好的起點是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.