私はGWTPプロジェクトを行っており、SpringデータJPAを使用してOracleデータベースとの接続を行っています。私はリポジトリインターフェイスが実装を使わずに直接使用されるいくつかのチュートリアルを読んだ。それは必要なところで@Autowiredで、うまくいきました。私は同じ戦略を使用しようとしましたが、@Autowired注釈が全く機能していないようです。ここで@AutowiredはSpringデータJPAリポジトリを挿入しません - NullPointerException
は私のリポジトリです:
@Repository
public interface BugRepository extends JpaRepository<Bug, Long> {
List<Bug> findAll();
.....
}
私は(私はRESTfulなサービスを使用する)私のサービスの実装で@Autowiredでそれを注入しようとする:ここで
@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();
}
}
は私のエンティティである:
私はmainContents.xmlとpersistence.xmlもmain/resources/META-INFにあります。ここに私の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>
そして最後に私が手に例外がある:
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)
...
私はデバッグするeコードとブレークポイントをautowiredリポジトリに置くと、nullであるように見えるので、正しく注入されないと思います。そのため、findAllメソッドを呼び出すとNullPointerExceptionが発生します。なぜ、@Autowiredアノテーションが機能していないと思われるのですか?
すべてのクラス(コンポーネント、サービス、リポジトリを持つ注釈付きクラス)のパッケージはcom.eduで始まりますか? – Unknown
春の管理豆ではなく、ジャージーによって管理されるので、 '@ Autowired'は何もしていません。依存関係が満たされない場合、実行中ではなく起動時にアプリケーションが破損する(起動しない)場合には、 '@ Autowired'フィールドは' null'にすることはできません。それが 'null 'のときは、自分でクラスのインスタンスを作成しています(つまり、新しいBugServiceImpl')、またはSpringのスコープの外側でそれを使用しています(これはあなたのことです)。ジャージーとスプリングが正しく統合されるようにセットアップする方法は、ジャージリファレンスガイドで明確に説明されています。 –
persistance.xmlには、Entity Bean(Bugのようなもの)のみが存在し、ServicesやReposは含まれていないはずです(ServiceImplにはリポジトリがあります) – Mechkov