2016-10-13 2 views
0

GWTP 프로젝트를 수행하고 Oracle 데이터베이스와의 연결에 스프링 데이터 JPA를 사용합니다. 구현을 사용하지 않고 저장소 인터페이스를 직접 사용하는 자습서를 읽었습니다. @Autowired는 필요에 따라 잘 작동했습니다. 동일한 전략을 사용하려고 시도했지만 @Autowired 주석이 전혀 작동하지 않는 것 같습니다. 여기 @Autowired는 스프링 데이터를 삽입하지 않습니다. JPA 저장소 - NullPointerException

내 저장소입니다 :

나는 (내가 편안하고 서비스를 사용) 내 서비스 구현에 @Autowired와 함께 주입하려고
@Repository 
public interface BugRepository extends JpaRepository<Bug, Long> { 
    List<Bug> findAll(); 
..... 
} 

:

: 여기
@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(); 
    } 
} 

내 법인입니다

mainContact.xml 및 persistence.xml도 main/resources/META-INF에 있습니다.

<?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) 
... 

여기 내 applicationContext.xml이다 내가 디버그 일 전자 코드 및 중단 점을 autowired 저장소에 넣으십시오. 그래서 null로 보입니다. 그래서 제대로 삽입되지 않았으므로 findAll 메서드를 호출하면 NullPointerException이 발생합니다. 왜 @Autowired 어노테이션이 작동하지 않는 것 같습니까?

+0

모든 클래스 (구성 요소, 서비스, 저장소가있는 주석 된 클래스)의 패키지는 com.edu로 시작됩니까? – Unknown

+0

스프링 관리 콩이 아니고 저지에 의해 관리되기 때문에'@ Autowired'는 아무 것도하지 않습니다. 의존성을 만족할 수 없다면'@ Autowired' 필드는'null'이 될 수 없습니다. 응용 프로그램이 시작될 때 중단되고 (시작되지 않음) 실행 중에 중단되지 않습니다. 그것이 'null'일 때 당신은 클래스의 인스턴스를 직접 생성하고 있습니다 (즉, 새로운 BugServiceImpl') 또는 유 (Spring의 범위 밖에서 사용하고 있습니다.). 저지와 스프링이 올바르게 통합되도록 설정하십시오. 저어지가 어떻게 수행되는지는 저지 참조 안내서에 명확하게 설명되어 있습니다. –

+0

persistance.xml에서 Bug와 같은 엔티티 bean 만 있고 Service 또는 Repos는 가지고 있지 않다고 가정합니다. (ServiceImpl에 따라 Repo가 있습니다.) – Mechkov

답변

0

스프링/JPA 구성의 두 가지 방법을 혼합한다고 생각합니다. 지난 번 내가 XML로 Spring/JPA 프로젝트를 구성했을 때 DataSource 빈만을 데이터베이스에 연결하기위한 persistence.xml 구성없이 사용했습니다. 스프링 데이터의 공식 문서를 읽으라고 제안 할 수 있습니다. 커뮤니티에는 최고의 문서 중 하나가 있습니다. 둘째

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

: 내가 볼

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

0

먼저 문제는 당신이 @Repository

당신은 그렇게하지 말아야와 인터페이스를 주석 한,하지만로는 다음과 BugRepository 인터페이스가 아래 패키지에 있는지 확인하십시오. 그렇지 않으면 작동하지 않습니다.

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

셋째 내가 눈치 것은 당신의 persistance.xml에, 당신은뿐만 아니라 @Entity 콩,하지만 @Service@Repository을 지적했다.당신 만 (관리 할 수 ​​있습니다) @Entity

마지막으로 이로되어있다, 당신은 SpringJersey 혼합 것 같다, 그래서 제대로 설정 당신이 당신의 Spring 컨테이너 (응용 프로그램/웹 컨텍스트)를 가지고 있는지 확인, 그래서 당신의 bean/repos/services를 관리 할 수 ​​있습니다.

0

도움을 주신 모든 분들께 감사드립니다. 나는 내 문제를 해결했다. 구성 파일에 문제가 있습니다.

먼저, 나는 내 데이터베이스와의 연결에 관한 모든 필요한 정보가 포함 된 applicationContext.xml에 dataSource bean을 만들었 기 때문에 persistence.xml이 필요하지 않았습니다. 두 가지를 섞어서는 안됩니다.

둘째입니다. 스프링과 저지 사이의 링크를 올바르게 구성해야합니다. 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이 쓸모가 없어서 주석과 데이터베이스 연결이 작동하지 않습니다. 나는 ContextLoadListener 웹 구성이 다른 구성 XML 파일을 "수신"확실하게하고는 applicationContext.xml 지금 읽고 사용 방법 이해로

<?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 파일입니다. 그리고 이러한 설정

<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

나는 내 문제를 희망이 답변이 유사한 구성 문제와 모든 유용합니다.

관련 문제