2016-10-13 13 views
0

私は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アノテーションが機能していないと思われるのですか?

+0

すべてのクラス(コンポーネント、サービス、リポジトリを持つ注釈付きクラス)のパッケージはcom.eduで始まりますか? – Unknown

+0

春の管理豆ではなく、ジャージーによって管理されるので、 '@ Autowired'は何もしていません。依存関係が満たされない場合、実行中ではなく起動時にアプリケーションが破損する(起動しない)場合には、 '@ Autowired'フィールドは' null'にすることはできません。それが 'null 'のときは、自分でクラスのインスタンスを作成しています(つまり、新しいBugServiceImpl')、またはSpringのスコープの外側でそれを使用しています(これはあなたのことです)。ジャージーとスプリングが正しく統合されるようにセットアップする方法は、ジャージリファレンスガイドで明確に説明されています。 –

+0

persistance.xmlには、Entity Bean(Bugのようなもの)のみが存在し、ServicesやReposは含まれていないはずです(ServiceImplにはリポジトリがあります) – Mechkov

答えて

0

私はSpring/JPA構成の2つの方法を混在させていると思います。 XMLでSpring/JPAプロジェクトを設定した最後のときには、データベースへの接続にpersistence.xmlコンフィグレーションなしでDataSource beanのみを使用します。 Spring Dataの公式文書を読むことをお勧めします。コミュニティには最高のドキュメントがあります。

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

0

私が見る最初に問題は、あなたがそれを行うべきではありませんあなたは@Repository

であなたのインタフェースを注釈を付けているが、以下のように:、第二

//no annotation here 
public interface BugRepository extends JpaRepository<Bug, Long> { 
    List<Bug> findAll(); 
..... 
} 

をあなたのBugRepositoryインターフェイスが以下のパッケージに含まれていることを確認してください。そうでない場合は動作しません。

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

第三に、私は気づい事はあなたのpersistance.xmlである、あなただけではなく@Entity豆、しかし@Service@Repositoryを指摘しています。あなたが唯一の(管理される)@Entity

最後、あなたがSpringJerseyを混合しているように見えるので、あなたがあなたの春のコンテナ(アプリケーション/ Webコンテキスト)が適切に設定されていることを確認しますが、持っていることになっていますあなたのbean/repos/servicesを管理(注入)することができます。

0

私はすべての協力に感謝したいと思います。私は私の問題を解決しました。私の設定ファイルに問題がありました。すべての

まず、私は私のapplicationContext.xmlをでのdataSource Beanを作成しましたので、私は本当に私のデータベースとの接続に関する必要なすべての情報が含まれている任意のpersistence.xmlのを必要としませんでした。あなたは両方のものを混ぜ合わせるべきではない、と私は考えている。

第2にの場合、SpringとJersey間のリンクを正しく設定する必要があります。私は、SpringとJerseyをリンクするために必要だったpom.xmlにいくつかの新しい依存関係を追加しなければなりませんでした(私が知らなかったジャージースプリング3依存関係があります)。だから、今私が使用して依存関係、関係春とジャージーのすべては、これらです:

 <dependency> 
      <groupId>javax.ws.rs</groupId> 
      <artifactId>javax.ws.rs-api</artifactId> 
      <version>${javax.rs.version}</version> 
     </dependency> 
     <dependency> 
      <groupId>org.glassfish.jersey.containers</groupId> 
      <artifactId>jersey-container-servlet</artifactId> 
      <version>${jersey.version}</version> 
     </dependency> 
     <dependency> 
      <groupId>org.glassfish.jersey.core</groupId> 
      <artifactId>jersey-server</artifactId> 
      <version>${jersey.version}</version> 
     </dependency> 
     <dependency> 
      <groupId>org.glassfish.jersey.media</groupId> 
      <artifactId>jersey-media-json-jackson</artifactId> 
      <version>${jersey.version}</version> 
     </dependency> 

     <dependency> 
      <groupId>org.fusesource.restygwt</groupId> 
      <artifactId>restygwt</artifactId> 
      <version>1.4</version> 
     </dependency> 

     <dependency> 
      <groupId>io.spring.platform</groupId> 
      <artifactId>platform-bom</artifactId> 
      <version>1.1.2.RELEASE</version> 
      <type>pom</type> 
      <!--<scope>import</scope>--> 
      <scope>compile</scope> 
     </dependency> 

     <!-- DataSource (HikariCP) --> 
     <dependency> 
      <groupId>com.zaxxer</groupId> 
      <artifactId>HikariCP</artifactId> 
      <version>2.2.5</version> 
     </dependency> 

     <!-- JPA Provider (Hibernate) --> 
     <dependency> 
      <groupId>org.hibernate</groupId> 
      <artifactId>hibernate-entitymanager</artifactId> 
      <version>4.3.8.Final</version> 
     </dependency> 

     <dependency> 
      <groupId>org.springframework.data</groupId> 
      <artifactId>spring-data-jpa</artifactId> 
      <version>1.10.2.RELEASE</version> 
     </dependency> 

     <dependency> 
      <groupId>com.oracle</groupId> 
      <artifactId>ojdbc6</artifactId> 
      <version>12.1.0.2</version> 
     </dependency> 

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

     <dependency> 
      <groupId>org.springframework</groupId> 
      <artifactId>spring-context</artifactId> 
      <version>${spring.version}</version> 
     </dependency> 

    <dependency> 
     <groupId>org.springframework</groupId> 
     <artifactId>spring-beans</artifactId> 
     <version>${spring.version}</version> 
    </dependency> 

    <dependency> 
     <groupId>org.springframework</groupId> 
     <artifactId>spring-core</artifactId> 
     <version>${spring.version}</version> 
    </dependency> 

    <dependency> 
     <groupId>org.springframework</groupId> 
     <artifactId>spring-orm</artifactId> 
     <version>${spring.version}</version> 
    </dependency> 

    <dependency> 
     <groupId>org.springframework</groupId> 
     <artifactId>spring-web</artifactId> 
     <version>${spring.version}</version> 
    </dependency> 

    <dependency> 
     <groupId>org.glassfish.jersey.ext</groupId> 
     <artifactId>jersey-spring3</artifactId> 
     <version>${jersey.version}</version> 
     <exclusions> 
      <exclusion> 
       <groupId>org.springframework</groupId> 
       <artifactId>spring-core</artifactId> 
      </exclusion> 
      <exclusion> 
      <groupId>org.springframework</groupId> 
       <artifactId>spring-web</artifactId> 
      </exclusion> 
      <exclusion> 
       <groupId>org.springframework</groupId> 
       <artifactId>spring-beans</artifactId> 
      </exclusion> 
     </exclusions> 
    </dependency> 

また、私はジャージーをapplicationContext.xmlをを読むことができるように、私のweb.xmlを設定する必要がありました。私のweb.xmlを設定せずに、applicationContext.xmlは役に立たなかったので、注釈とデータベースとの接続が機能しませんでした。ここに私のweb.xmlは次のとおりです。私の知る限りContextLoadListenerを理解できるように

<?xml version="1.0" encoding="UTF-8"?> 
    <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
      xmlns="http://java.sun.com/xml/ns/javaee" 
      xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
    http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" 
      version="2.5"> 

     <listener> 
     <listener-class> 
      org.springframework.web.context.ContextLoaderListener 
     </listener-class> 
     </listener> 

     <welcome-file-list> 
     <welcome-file>index.html</welcome-file> 
     </welcome-file-list> 

     <context-param> 
      <param-name>contextConfigLocation</param-name> 
      <param-value>classpath:META-INF/applicationContext.xml</param-value> 
     </context-param> 

     <servlet> 
      <servlet-name>jersey-serlvet</servlet-name> 
      <servlet-class> 
      org.glassfish.jersey.servlet.ServletContainer 
      </servlet-class> 
     <init-param> 
      <param-name>jersey.config.server.provider.packages</param-name> 
      <param-value>com.edu</param-value> 
     </init-param> 
     <load-on-startup>1</load-on-startup> 
     </servlet> 

     <servlet-mapping> 
      <servlet-name>jersey-serlvet</servlet-name> 
      <url-pattern>/rest/*</url-pattern> 
     </servlet-mapping> 
    </web-app> 

は、必ずWeb設定を行い、他の構成XMLファイルに対して、「リッスン」、それはapplicationContext.xmlを、今読んで、使用されている方法です。そして、これらの設定

<param-name>jersey.config.server.provider.packages</param-name> 
     <param-value>com.edu</param-value> 

と私は私のパッケージは@Providerと@Pathアノテーションのためにスキャンされるだろうと私のコードのこれらの部分なしで私のサービスがアクティブではないことを確認してください。設定 このプロバイダの詳細パッケージには、ここで読むことができます:

https://jersey.java.net/apidocs/2.23.2/jersey/org/glassfish/jersey/server/ServerProperties.html#PROVIDER_PACKAGES

私は私の問題であり、この回答が同様の構成の問題を持つすべてのに役立ちます願っています。

関連する問題