2014-12-23 115 views
0

我知道這個問題被多次詢問,但我現在看了幾個晚上,我似乎無法找出爲什麼Autowired字段保持爲空。我盯着它看,所以也許你們中的一些人看到了什麼是錯的。Autowiring似乎失敗

我有以下代碼:

的applicationContext.xml

<beans xmlns="http://www.springframework.org/schema/beans" xmlns:context="http://www.springframework.org/schema/context" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd "> 
    <context:component-scan base-package="com.skoerkamp"/> 
    <import resource="ApplicationContext-persistence.xml"/> 
    </beans> 

的ApplicationContext-的persistence.xml

<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:jdbc="http://www.springframework.org/schema/jdbc" xmlns:tx="http://www.springframework.org/schema/tx" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd http://www.springframework.org/schema/jdbc http://www.springframework.org/schema/jdbc/spring-jdbc-4.0.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.0.xsd"> 
    <tx:annotation-driven transaction-manager="transactionManager"/> 
    <bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager"> 
     <property name="entityManagerFactory" ref="entityManagerFactory"/> 
    </bean> 
    <bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"> 
     <property name="packagesToScan" value="com.skoerkamp.model"/> 
     <property name="dataSource" ref="dataSource"/> 
     <property name="persistenceUnitName" value="GP_UNIT"/> 
     <property name="jpaProperties"> 
      <props> 
       <prop key="hibernate.dialect">org.hibernate.dialect.MySQL5InnoDBDialect</prop> 
       <!-- 
       <prop key="hibernate.hbm2ddl.auto">create-drop</prop> 
       --> 
      </props> 
     </property> 
     <property name="jpaVendorAdapter"> 
      <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter"> 
       <property name="showSql" value="false"/> 
       <property name="generateDdl" value="false"/> 
      </bean> 
     </property> 
    </bean> 
    <!-- DB configuration --> 
    <bean name="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"> 
     <property name="driverClassName" value="com.mysql.jdbc.Driver"/> 
     <property name="url" value="<connection-url>"/> 
     <property name="username" value="<user>"/> 
     <property name="password" value="<pw>"/> 
    </bean> 

</beans> 

的pom.xml

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"> 
    <modelVersion>4.0.0</modelVersion> 
    <groupId>com.skoerkamp</groupId> 
    <artifactId>groupplanner</artifactId> 
    <packaging>war</packaging> 
    <version>1.0-SNAPSHOT</version> 
    <name>Group Planner Server</name> 
    <url>http://maven.apache.org</url> 

    <repositories> 
     <repository> 
      <id>maven2-repository.java.net</id> 
      <name>Java.net Repository for Maven</name> 
      <url>http://download.java.net/maven/2/</url> 
      <layout>default</layout> 
     </repository> 
    </repositories> 

    <dependencies> 
     <dependency> 
      <groupId>junit</groupId> 
      <artifactId>junit</artifactId> 
      <version>4.8.2</version> 
      <scope>test</scope> 
     </dependency> 

     <dependency> 
      <groupId>com.sun.jersey</groupId> 
      <artifactId>jersey-server</artifactId> 
      <version>1.8</version> 
     </dependency> 
     <dependency> 
      <groupId>org.json</groupId> 
      <artifactId>json</artifactId> 
      <version>20141113</version> 
     </dependency> 
     <dependency> 
      <groupId>javax.ws.rs</groupId> 
      <artifactId>jsr311-api</artifactId> 
      <version>1.1.1</version> 
     </dependency> 

     <!-- Spring --> 
     <dependency> 
      <groupId>org.springframework</groupId> 
      <artifactId>spring-core</artifactId> 
      <version>4.1.3.RELEASE</version> 
     </dependency> 
     <dependency> 
      <groupId>org.springframework</groupId> 
      <artifactId>spring-context</artifactId> 
      <version>4.1.3.RELEASE</version> 
     </dependency> 
     <dependency> 
      <groupId>org.springframework</groupId> 
      <artifactId>spring-web</artifactId> 
      <version>3.0.4.RELEASE</version> 
     </dependency> 
     <dependency> 
      <groupId>org.springframework</groupId> 
      <artifactId>spring-beans</artifactId> 
      <version>4.1.3.RELEASE</version> 
     </dependency> 

     <dependency> 
      <groupId>org.springframework</groupId> 
      <artifactId>spring-tx</artifactId> 
      <version>4.0.5.RELEASE</version> 
     </dependency> 
     <dependency> 
      <groupId>org.springframework</groupId> 
      <artifactId>spring-orm</artifactId> 
      <version>4.1.3.RELEASE</version> 
     </dependency> 
     <dependency> 
      <groupId>org.springframework</groupId> 
      <artifactId>spring-jdbc</artifactId> 
      <version>4.1.3.RELEASE</version> 
     </dependency> 

     <!--Database--> 
     <dependency> 
      <groupId>mysql</groupId> 
      <artifactId>mysql-connector-java</artifactId> 
      <version>5.1.24</version> 
     </dependency> 
     <dependency> 
      <groupId>org.hibernate</groupId> 
      <artifactId>hibernate-validator</artifactId> 
      <version>5.1.3.Final</version> 
     </dependency> 
     <dependency> 
      <groupId>org.hibernate</groupId> 
      <artifactId>hibernate-entitymanager</artifactId> 
      <version>4.3.7.Final</version> 
     </dependency> 

    </dependencies> 

    <build> 
     <finalName>groupplanner</finalName> 
     <plugins> 
      <plugin> 
       <groupId>org.apache.maven.plugins</groupId> 
       <artifactId>maven-compiler-plugin</artifactId> 
       <version>3.2</version> 
       <configuration> 
        <source>1.7</source> 
        <target>1.7</target> 
       </configuration> 
      </plugin> 
      <plugin> 
       <artifactId>maven-failsafe-plugin</artifactId> 
       <version>2.6</version> 
       <executions> 
        <execution> 
         <goals> 
          <goal>integration-test</goal> 
          <goal>verify</goal> 
         </goals> 
        </execution> 
       </executions> 
      </plugin> 
      <plugin> 
       <groupId>org.mortbay.jetty</groupId> 
       <artifactId>maven-jetty-plugin</artifactId> 
       <version>6.1.16</version> 
       <configuration> 
        <scanIntervalSeconds>10</scanIntervalSeconds> 
        <stopPort>8005</stopPort> 
        <stopKey>STOP</stopKey> 
        <webApp> 
         <contextPath>/groupplanner</contextPath> 
        </webApp> 
       </configuration> 
       <executions> 
        <execution> 
         <id>start-jetty</id> 
         <phase>pre-integration-test</phase> 
         <goals> 
          <goal>run</goal> 
         </goals> 
         <configuration> 
          <scanIntervalSeconds>0</scanIntervalSeconds> 
          <daemon>true</daemon> 
         </configuration> 
        </execution> 
        <execution> 
         <id>stop-jetty</id> 
         <phase>post-integration-test</phase> 
         <goals> 
          <goal>stop</goal> 
         </goals> 
        </execution> 
       </executions> 
      </plugin> 
     </plugins> 
    </build> 
</project> 

對於測試PUR只對我的服務提出一個簡單的電話。

package com.skoerkamp.rest; 

import com.skoerkamp.service.CalendarService; 
import org.springframework.beans.factory.annotation.Autowired; 
import org.springframework.stereotype.Service; 

import javax.ws.rs.GET; 
import javax.ws.rs.Path; 

@Path("/calendar") 
@Service 
public class CalendarEndpoint { 

    @Autowired 
    private CalendarService calendarService; 

    @GET 
    public String getCalendarItems() { 
     calendarService.create(); 
     return ""; 
    } 

} 

服務:

package com.skoerkamp.service; 

import com.skoerkamp.model.CalendarItem; 
import com.skoerkamp.repository.CalendarRepository; 
import org.springframework.beans.factory.annotation.Autowired; 
import org.springframework.stereotype.Component; 
import org.springframework.stereotype.Service; 

@Service 
public class CalendarService { 

    @Autowired 
    private CalendarRepository calendarRepository; 

    public void create() { 
     calendarRepository.create(new CalendarItem("TEST")); 
    } 
} 

這是堆棧跟蹤我得到的一部分:

java.lang.NullPointerException 
    at com.skoerkamp.rest.CalendarEndpoint.getCalendarItems(CalendarEndpoint.java:23) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:606) 
    at com.sun.jersey.spi.container.JavaMethodInvokerFactory$1.invoke(JavaMethodInvokerFactory.java:60) 
    at com.sun.jersey.server.impl.model.method.dispatch.AbstractResourceMethodDispatch 

第23行是調用calendarService。

對不起長長的文字,但我想盡可能清楚地表明我的問題。任何意見或建議表示讚賞!在此先感謝:)

+7

你還沒有澤西與春天。該對象目前由Jersey管理,而不是由Spring管理。 –

回答

1

隨着春天,Autowire將始終連線的豆,否則將失敗,除非你特別標記爲@autowired(required = false)如果你得到一個空指針,它不是自動裝配,這意味着你沒有使用Spring來管理你的豆子。

您需要使用Spring MVC(Spring DispatcherServlet)來實例化對象。在http://docs.spring.io/spring/docs/current/spring-framework-reference/html/mvc.html中查看17.2。這將向您展示如何配置項目(使用XML或僅使用Annotation),以便Spring將管理您的bean並正確自動裝載所有內容。

+0

包括Sotirios的評論我今晚會嘗試這個。我只想在可能的情況下使用註釋。感謝您的輸入 – ProCx

0

爲了加載你的bean並自動裝配它們,你需要在你的web.xml文件中配置ContextLoaderListener,並指定你的主主上下文的位置是「ApplicationContext.xml」,默認ContextLoaderListener加載以下文件上下文「/WEB-INF/applicationContext.xml」,所以請適當地重命名您的文件。這裏有一些鏈接,可以幫助您設置和理解上下文加載機制:

http://www.springbyexample.org/examples/simple-spring-mvc-form-annotation-config-webapp.html#simple-spring-mvc-form-annotation-config-webapp-web-config http://docs.spring.io/spring/docs/current/spring-framework-reference/html/beans.html#context-create

,並說明如何逐步建立與Spring 3步寧靜的API的教程:http://www.ibm.com/developerworks/web/library/wa-spring3webserv/index.html?ca=drs-

+0

我在web.xml中定義了這個。我現在不能添加文件,因爲我不在家,但是我知道當我運行它時,它找到了上下文 – ProCx

0

您需要在界面上使用@Autowired註釋而不是類。

所以,創建一個接口,讓CalendarService類實現它,然後自動裝載接口。

希望它的作品!

相關問題