java - @Autowired 不注入(inject) Spring Data JPA 存储库 - NullPointerException

标签 java spring repository spring-data-jpa autowired

我正在做一个 GWTP 项目,并使用 Spring Data JPA 与 Oracle 数据库连接。我读过一些教程,其中直接使用存储库接口(interface),而不使用实现。这是@Autowired 在需要的地方并且工作得很好。我尝试使用相同的策略,但似乎 @Autowired 注释根本不起作用。

这是我的存储库:

@Repository
public interface BugRepository extends JpaRepository<Bug, Long> {
  List<Bug> findAll();
.....
}

我尝试在我的服务实现中使用 @Autowired 注入(inject)它(我使用 RESTful 服务):

@Produces(MediaType.APPLICATION_JSON)
@Consumes(MediaType.APPLICATION_JSON)
@Path("/bugs")
@Component
public class BugServiceImpl{
    @Autowired
    private BugRepository bugRepository;

    @GET
    @Path("/findAll")
    public List<Bug> findAll() {
    return bugRepository.findAll();
    }
}

这是我的实体:

@Entity
@Table(name = "BUGS")
@SequenceGenerator(name = "BUG_SEQUENCE", sequenceName = "BUG_SEQUENCE")
public class Bug implements Serializable { 

   @Id
   @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "BUG_SEQUENCE")
   @Column(name="BUG_ID")
   private Long bugId;

   @Column(name="BUG_NAME")
   private String bugName;

   @OneToOne
   @PrimaryKeyJoinColumn
   @Column(name="CREATED_BY")
   private User createdBy;

   @OneToOne
   @PrimaryKeyJoinColumn
   @Column(name="ASSIGNED_TO")
   private User assignedTo;

   @Column(name="CREATION_DATE")
   private Date creationDate;

   @Column(name="LAST_UPDATE_DATE")
   private Date lastUpdateDate;

   @Column(name="BUG_COMMENT")
   private String bugComment;

   @OneToOne(cascade = CascadeType.ALL, optional = false, fetch = FetchType.EAGER, orphanRemoval = true)
   @PrimaryKeyJoinColumn
   @Column(name="PRIORITY_ID")
   private Priority priority;

   @OneToOne
   @PrimaryKeyJoinColumn
   private Status status;

   public Bug() {
   }
}

我在 main/resources/META-INF 中还有 applicationContext.xml 和 persistence.xml。这是我的 applicationContext.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"
   xmlns:jpa="http://www.springframework.org/schema/data/jpa"
   xmlns:jdbc="http://www.springframework.org/schema/jdbc"
   xmlns:p="http://www.springframework.org/schema/p"

   xsi:schemaLocation="http://www.springframework.org/schema/beans
   http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
   http://www.springframework.org/schema/context
   http://www.springframework.org/schema/context/spring-context-3.0.xsd
   http://www.springframework.org/schema/tx
   http://www.springframework.org/schema/tx/spring-tx-3.1.xsd
   http://www.springframework.org/schema/beans
   http://www.springframework.org/schema/beans/spring-beans.xsd
   http://www.springframework.org/schema/data/jpa
   http://www.springframework.org/schema/data/jpa/spring-jpa-1.0.xsd
   http://www.springframework.org/schema/jdbc
   http://www.springframework.org/schema/jdbc/spring-jdbc.xsd">

<context:component-scan base-package="com.edu" />

<jpa:repositories base-package="com.edu.server.repositories" />

<context:annotation-config />

<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
    <property name="driverClassName" value="oracle.jdbc.OracleDriver" />
    <property name="url" value="***"/>
    <property name="username" value="***"/>
    <property name="password" value="***"/>
</bean>

<!-- EntityManagerFactory -->
<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"
      p:packagesToScan="com.edu.shared.entity"
      p:dataSource-ref="dataSource"
>
    <property name="jpaVendorAdapter">
        <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
            <property name="generateDdl" value="true" />
            <property name="showSql" value="false" />
        </bean>
    </property>
</bean>

<tx:annotation-driven transaction-manager="transactionManager" />

<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
    <property name="entityManagerFactory" ref="entityManagerFactory" />
</bean>

我的 persistence.xml :

<persistence xmlns="http://java.sun.com/xml/ns/persistence"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd"
         version="2.0">

<!-- oracle -->

<persistence-unit name="oracle">
    <provider>org.hibernate.ejb.HibernatePersistence</provider>

    <class>com.edu.server.service.BugServiceImpl</class>
    <class>com.edu.server.repositories.BugRepository</class>
    <class>com.edu.shared.entity.Bug</class>

    <properties>
        <property name="hibernate.archive.autodetection" value="class" />
        <property name="hibernate.dialect" value="org.hibernate.dialect.Oracle10gDialect" />
        <property name="hibernate.connection.driver_class" value="oracle.jdbc.OracleDriver" />
        <property name="hibernate.connection.url" value="***" />
        <property name="hibernate.connection.username" value="***" />
        <property name="hibernate.connection.password" value="***" />
        <property name="hibernate.flushMode" value="FLUSH_AUTO" />
        <property name="hibernate.hbm2ddl.auto" value="update" />
    </properties>
</persistence-unit>

最后我得到的异常(exception)是:

java.lang.NullPointerException
com.edu.server.service.BugServiceImpl.findAll(BugServiceImpl.java:39)
sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
java.lang.reflect.Method.invoke(Method.java:606)
...

当我调试代码并向 Autowiring 存储库放置断点时,它似乎为空,因此我认为它没有正确注入(inject),这就是调用方法 findAll 会引发 NullPointerException 的原因。那么,为什么您认为 @Autowired 注释不起作用?

最佳答案

我认为您正在混合两种 Spring/JPA 配置方式。上次当我使用 XML 配置 Spring/JPA 项目时,我仅使用 DataSource bean,而没有 persistence.xml 配置来连接到数据库。我建议你阅读 Spring Data 的官方文档。该社区拥有最好的文档之一。

http://docs.spring.io/spring/docs/current/spring-framework-reference/html/orm.html

关于java - @Autowired 不注入(inject) Spring Data JPA 存储库 - NullPointerException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40020978/

相关文章:

java - 使用 STS 模板项目创建新的 Spring MVC 项目时出现奇怪的行为,URL 不正确,我必须重建项目

repository - 应如何表示将聚合根添加到存储库?

svn - Tortoise SVN check out 在Windows 8中不起作用

java - Pelops Java 客户端插入 Cassandra 数据库

java - 我如何模拟事件处理程序?

java - Android 中的向后兼容性和 SDK 更新

java - 无法删除列表中的重复项

java - Spring JPA 存储库最近日期

spring - 开箱即用的缓存控制 header 过滤器就可以了吗?

mercurial - 如何从 Mercurial 克隆中删除工作副本?