【发布时间】:2014-08-01 18:21:55
【问题描述】:
我想使用 Spring Data JPA 来做 ORM。我有以下声明的存储库接口:
public interface SegmentRepository extends JpaRepository<Segment, Integer> {
// query methods ...
}
以下是 Java Config 类:
@Configuration
@EnableJpaRepositories("com.example.cap.repositories")
@EnableTransactionManagement
public class CAPRepositoryConfig {
@Bean
public DataSource dataSource() {
BasicDataSource ds = new BasicDataSource();
ds.setDriverClassName(org.postgresql.Driver.class.getName());
ds.setUsername("postgres");
ds.setPassword("password");
ds.setUrl("jdbc:postgresql://localhost:5432/postgres");
ds.setInitialSize(10);
return ds;
}
@Bean
public EntityManagerFactory entityManagerFactory() {
EclipseLinkJpaVendorAdapter vendorAdapter = new EclipseLinkJpaVendorAdapter();
vendorAdapter.setGenerateDdl(true);
LocalContainerEntityManagerFactoryBean factory = new LocalContainerEntityManagerFactoryBean();
Map<String, Object> jpaProperties = new HashMap<String, Object>();
jpaProperties.put("eclipselink.weaving", "false");
factory.setJpaVendorAdapter(vendorAdapter);
factory.setPackagesToScan("com.example.cap.repositories");
factory.setDataSource(dataSource());
factory.setJpaPropertyMap(jpaProperties);
factory.afterPropertiesSet();
return factory.getObject();
}
@Bean
public PlatformTransactionManager transactionManager() {
JpaTransactionManager txManager = new JpaTransactionManager();
txManager.setEntityManagerFactory(entityManagerFactory());
return txManager;
}
}
而Segment 类在com.example.cap.repositories 中定义为:
@Entity
public class Segment {
@Id
private int segmentID;
private int caseID;
private Timestamp segStartTime;
private Timestamp segEndTime;
//setter and getters
}
但是当我使用自动注入的 bean SegmentRepository 运行 JUnit 测试时,我得到了 bean repository 的空点异常:
@ContextConfiguration(classes=CAPRepositoryConfig.class)
public class CAPRepositoryTest {
@Autowired
private SegmentRepository repository;
@Test
public void testRepository() {
Segment seg = repository.findOne(123); //null pointer exception for repository
}
}
根据 Spring Data JPA 文档,只要我在 Java Config 类中指定 @EnableJpaRepositories,SegmentRepository bean repository 就应该自动注入。但是为什么我在 JUnit 测试类中得到 repository 的空指针异常?由于SegmentRepository是一个接口而不是一个类,所以我无法通过Java Config类创建实例。
【问题讨论】:
标签: java jpa dependency-injection spring-data-jpa spring-java-config