spring hibernate nullpointerexception依赖注入

rm5edbpk  于 2021-07-13  发布在  Java
关注(0)|答案(1)|浏览(405)

我有一个maven项目,它有一个dao类,一个实体类和一个junit测试用例。我正在对dao类使用依赖注入,但是它给出了一个空指针异常。我知道这是spring中遇到的一个常见错误,但是他们说当我们使用新操作符来创建spring组件的示例时会发生这种情况,但是我没有对dao类使用新操作符,因为dao类是唯一的类使用@component注解。
实体类

package com.lti.entity;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;

@Entity
public class Sport {
    @Id
    @GeneratedValue
    private int sportId;
    private String sportName;

    public int getSportId() {
        return sportId;
    }
    public void setSportId(int sportId) {
        this.sportId = sportId;
    }
    public String getSportName() {
        return sportName;
    }
    public void setSportName(String sportName) {
        this.sportName = sportName;
    }
}

道类

package com.lti.dao;

import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.transaction.Transactional;

import org.springframework.stereotype.Component;

@Component
public class GenericDao {

    @PersistenceContext
    private EntityManager em;

    @Transactional
    public Object save(Object e) {
        Object obj=em.merge(e);
        return obj;
    }

    public Object fetchById(Class c1,Object id) {
        return em.find(c1,id);
    }

}

运动试验

import org.junit.Test;
import org.springframework.beans.factory.annotation.Autowired;

import com.lti.dao.GenericDao;
import com.lti.entity.Sport;

public class SportTest {

    @Autowired
    private GenericDao dao;

    @Test
    public void add() {
        Sport s=new Sport();
        s.setSportName("Football");
        dao.save(s);
    }

}

app-config.xml文件

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:context="http://www.springframework.org/schema/context"
    xmlns:tx="http://www.springframework.org/schema/tx"
    xsi:schemaLocation="http://www.springframework.org/schema/beans 
          http://www.springframework.org/schema/beans/spring-beans.xsd
          http://www.springframework.org/schema/context
          http://www.springframework.org/schema/context/spring-context.xsd
          http://www.springframework.org/schema/tx
          http://www.springframework.org/schema/tx/spring-tx.xsd">

    <!-- Loading annotated beans -->
    <context:component-scan base-package="com.lti.dao" />

    <!-- DataSource configuration -->
    <bean id="dataSource" class="org.apache.commons.dbcp2.BasicDataSource" init-method="createDataSource" destroy-method="close">
        <property name="driverClassName" value="oracle.jdbc.driver.OracleDriver" />
        <property name="url" value="jdbc:oracle:thin:@localhost:1521:XE" />
        <property name="username" value="hr" />
        <property name="password" value="hr" />
        <property name="initialSize" value="1" />
    </bean>

    <!-- Spring/Hibernate Integration Settings -->
    <!-- This bean entry below will create the EntityManagerFactory
        & EntityManager object for us. Also we don't need a separate
        META-INF/persistence.xml file as all the required ORM settings
        can be done within this bean configuration itself -->
    <bean id="myEmf" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
        <property name="dataSource" ref="dataSource" />
        <property name="packagesToScan" value="com.lti.entity" /> <!-- Location of @Entity classes -->
        <property name="jpaVendorAdapter">
            <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter" />
        </property>
        <property name="jpaProperties">
            <props>
                <prop key="hibernate.hbm2ddl.auto">update</prop>
                <prop key="hibernate.show_sql">true</prop>
            </props>
        </property>
    </bean>

    <!-- This bean entry will take of managing the transactions(begin/commit/rollback) in our code -->
    <bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
        <property name="entityManagerFactory" ref="myEmf" />
    </bean>

    <!-- Enabling support for @Transactional annotation -->
    <tx:annotation-driven />

</beans>

pom.xml文件

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>com.lti.sample</groupId>
  <artifactId>spring-example</artifactId>
  <version>0.0.1-SNAPSHOT</version>
    <dependencies>
    <!-- https://mvnrepository.com/artifact/org.springframework/spring-context -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>5.3.5</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-jdbc</artifactId>
            <version>5.3.5</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-orm</artifactId>
            <version>5.3.5</version>
        </dependency>

        <dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-core</artifactId>
            <version>5.4.30.Final</version>
        </dependency>

        <dependency>
            <groupId>com.oracle.database.jdbc</groupId>
            <artifactId>ojdbc8</artifactId>
            <version>18.3.0.0</version>
        </dependency>

        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.13.2</version>
        </dependency>

        <dependency>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-dbcp2</artifactId>
            <version>2.8.0</version>
        </dependency>
   </dependencies>
</project>
9lowa7mx

9lowa7mx1#

用@springboottest注解sporttest类

import org.junit.Test;
import org.springframework.beans.factory.annotation.Autowired;

import com.lti.dao.GenericDao;
import com.lti.entity.Sport;
import org.springframework.boot.test.context.SpringBootTest;

@SpringBootTest
public class SportTest {

@Autowired
private GenericDao dao;

@Test
public void add() {
    Sport s=new Sport();
    s.setSportName("Football");
    dao.save(s);
}

}

相关问题