【问题标题】:DataSource must not be null数据源不能为空
【发布时间】:2015-06-01 16:29:24
【问题描述】:

我的应用程序不使用 persistence.xml。所以我尝试使用 LocalContainerEntityManagerFactoryBean 来创建一个自定义的 EntityManager。但我收到错误,因为 DataSource 不能为空。有人可以帮忙解决这个问题吗?

PersistenceJPAConfig.java

@Configuration
@EnableTransactionManagement
@EnableJpaRepositories
public class PersistenceJPAConfig {

@Autowired
 private DataSource dataSource;

@Autowired
JpaVendorAdapter jpaVendorAdapter;

@Bean(name = "personEntityManager")
public EntityManager entityManager() {
    return entityManagerFactory().createEntityManager();
}

@Bean(name = "personEntityManagerFactory")
public EntityManagerFactory entityManagerFactory() {
    LocalContainerEntityManagerFactoryBean lef = new LocalContainerEntityManagerFactoryBean();
        lef.setDataSource(dataSource);
        lef.setJpaVendorAdapter(jpaVendorAdapter);
        lef.setPackagesToScan("com.myc.cc.domain.Person");
        lef.setPersistenceUnitName("personPersistenceUnit");
        lef.afterPropertiesSet();
        return lef.getObject();
}

@Primary
@Bean(name = "personTransactionManager")
 public PlatformTransactionManager transactionManager() {
        return new JpaTransactionManager(entityManagerFactory());
    } 
}

SearchPersonPredicates.java

public static Predicate findIdByEM(final Long pId) { 
    PersistenceJPAConfig jpaConfig = new PersistenceJPAConfig();
    EntityManager manager=  jpaConfig.entityManager(); 
    QPerson qPerson = QPerson.person; 
    QAddress qAddress = QAddress.address;
    BooleanBuilder booleanBuilder = new BooleanBuilder();
    JPAQuery jpaQuery = new JPAQuery(manager);
    JPASubQuery subQuery = new JPASubQuery();
    Predicate predicate;  
    if (pId != null) {
        booleanBuilder.or(QAddress.person_no.eq(pId));
    } 
    predicate = booleanBuilder.getValue();  
    jpaQuery = jpaQuery.from(qAddress).join(qPerson).on(predicate);  
    subQuery.from(qPerson, qAddress); 
    return predicate;
}

SearchPersonServiceImpl.java

public List<Person> findPnumberbyEM(Long id) { 
    Iterable<Person> person = personRepository.findAll(findIdByEM(id));
    return constructList(person);
}

private List<Person> constructList(Iterable<Person> persons) {
    List<Person> list = new ArrayList<Person>();
    for (Person person : persons) {
        list.add(person);
    } 
}

错误

17:52:35.337 ERROR 7016 --- [nio-8080-exec-2] o.a.c.c.C.[.[.[.[dispatcherServlet]      : Servlet.service() for servlet [dispatcherServlet] in context with path [/cc_dev] threw exception [Request processing failed; nested exception is java.lang.IllegalArgumentException: DataSource must not be null] with root cause

    java.lang.IllegalArgumentException: DataSource must not be null
        at org.springframework.util.Assert.notNull(Assert.java:112)
        at org.springframework.jdbc.datasource.lookup.SingleDataSourceLookup.<init>(SingleDataSourceLookup.java:40)
        at org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.setDataSource(LocalContainerEntityManagerFactoryBean.java:238)
        at com.myc.cc.repository.PersistenceJPAConfig.entityManagerFactory(PersistenceJPAConfig.java:43)
        at com.myc.cc.repository.PersistenceJPAConfig.entityManager(PersistenceJPAConfig.java:37)
        at com.myc.cc.repository.SearchPersonPredicates.findIdByEM(SearchPersonPredicates.java:121)
        at com.myc.cc.service.impl.SearchPersonServiceImpl.findPnumberbyEM(SearchPersonServiceImpl.java:70)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:606)
        at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:317)
        at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:201)
        at com.sun.proxy.$Proxy114.findPnumberbyEM(Unknown Source)
        at com.myc.cc.web.SearchPersonController.searchPerson(SearchPersonController.java:109)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:606)

提前致谢

【问题讨论】:

    标签: java jpa spring-boot datasource entitymanager


    【解决方案1】:

    您的datasource 属性可能未初始化。尝试将@Value 添加到datasource 属性:

    @Autowired
    @Value("${property.reference}") 
    private DataSource dataSource;
    

    【讨论】:

    • 感谢您的回复。我的应用程序使用 application-oracle.properties。 spring.jpa.hibernate.ddl-auto-none spring.datasource.platform=oracle spring.datasource.url=jdbc:oracle:thin:@//host:portnumber/database spring.datasource.username=USER spring.datasource.password=PASSWORD 你能帮忙指定我可以为@Value 注释输入什么值
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-23
    • 1970-01-01
    • 1970-01-01
    • 2020-05-19
    • 2019-06-12
    • 1970-01-01
    相关资源
    最近更新 更多