我正在做一个 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/