2016-01-13 100 views
0

使用Spring Boot和Spring Data JPA時,我在@Autowiring時收到null存儲庫。Spring Data JPA返回null存儲庫

我可能錯過了一些簡單的配置,但幾小時後看着它,並審查文檔,我發現沒有缺陷。我需要一雙嶄新的眼睛。

下面是相關配置:

@SpringBootApplication 
@EnableJpaRepositories 
@EnableTransactionManagement 
public class ServerApp { 
    public static void main(String[] args) { 
    SpringApplication.run(ServerApp.class, args); 
    } 
} 

A服務使用的存儲庫。當執行doSomething()時,repository爲空。

@Service 
@Slf4j 
public class MyService{ 
    @Autowired 
    private MyRepository repository; 

    @Override 
    public AnEntity doSomething(String index) { 
    return repository.findOneByIndex(index); 
    } 
} 

資源庫

public interface MyRepository extends JpaRepository<AnEntity, String> { 
    AnEntity findOneByIndex(String index); 
} 

實體

@Entity 
@Table(name = "entities") 
@Getter 
@Setter 
@ToString 
public class AnEntity implements Serializable{ 
    private static final long serialVersionUID = -6256451671609986911L; 
    @Id 
    @GeneratedValue(strategy=GenerationType.AUTO) 
    private Long id; 
    private String index; 
    private String data; 
} 

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"> 
<persistence-unit name="default"> 
    <provider>org.hibernate.jpa.HibernatePersistenceProvider</provider> 
    <class>com.myapp.AnEntity</class> 
    <properties> 
     <property name="hibernate.show_sql" value="true" /> 
     <property name="javax.persistence.transactionType" value="RESOURCE_LOCAL" /> 
     <property name="javax.persistence.jdbc.driver" value="org.postgresql.Driver" /> 
     <property name="javax.persistence.jdbc.url" value="jdbc:postgresql://localhost:5432/authServer" /> 
     <property name="javax.persistence.jdbc.user" value="user" /> 
     <property name="javax.persistence.jdbc.password" value="password" /> 
     <property name="hibernate.dialect" value="org.hibernate.dialect.PostgreSQLDialect" /> 
    </properties> 
</persistence-unit> 

的POM

<?xml version="1.0" encoding="UTF-8"?> 
<project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns="http://maven.apache.org/POM/4.0.0" 
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 
<modelVersion>4.0.0</modelVersion> 

<groupId>com.myapp</groupId> 
<artifactId>myapp</artifactId> 
<version>1.0-SNAPSHOT</version> 

<packaging>pom</packaging> 

<properties> 
    <java.version>1.8</java.version> 
</properties> 

<parent> 
    <groupId>org.springframework.boot</groupId> 
    <artifactId>spring-boot-starter-parent</artifactId> 
    <version>1.2.7.RELEASE</version> 
</parent> 

<dependencies> 
    <dependency> 
     <groupId>org.springframework.boot</groupId> 
     <artifactId>spring-boot-starter-web</artifactId> 
    </dependency> 
    <dependency> 
     <groupId>org.springframework.boot</groupId> 
     <artifactId>spring-boot-starter-actuator</artifactId> 
    </dependency> 
    <dependency> 
     <groupId>org.springframework.plugin</groupId> 
     <artifactId>spring-plugin-core</artifactId> 
     <version>1.2.0.RELEASE</version> 
    </dependency> 
    <dependency> 
     <groupId>org.springframework.boot</groupId> 
     <artifactId>spring-boot-starter-data-jpa</artifactId> 
    </dependency> 
    <dependency> 
     <groupId>org.postgresql</groupId> 
     <artifactId>postgresql</artifactId> 
     <version>9.4-1201-jdbc41</version> 
    </dependency> 
    <dependency> 
     <groupId>net.logstash.logback</groupId> 
     <artifactId>logstash-logback-encoder</artifactId> 
     <version>4.5.1</version> 
    </dependency> 
    <dependency> 
     <groupId>org.projectlombok</groupId> 
     <artifactId>lombok</artifactId> 
     <version>1.16.6</version> 
     <scope>provided</scope> 
    </dependency> 
    <dependency> 
     <groupId>junit</groupId> 
     <artifactId>junit</artifactId> 
     <version>4.12</version> 
     <scope>test</scope> 
    </dependency> 
    <dependency> 
     <groupId>org.springframework.boot</groupId> 
     <artifactId>spring-boot-starter-test</artifactId> 
     <scope>test</scope> 
    </dependency> 
    <dependency> 
     <groupId>com.jayway.jsonpath</groupId> 
     <artifactId>json-path</artifactId> 
     <version>2.0.0</version> 
     <scope>test</scope> 
    </dependency> 
    <dependency> 
     <groupId>br.com.six2six</groupId> 
     <artifactId>fixture-factory</artifactId> 
     <version>3.0.0</version> 
     <exclusions> 
      <exclusion> 
       <groupId>log4j</groupId> 
       <artifactId>log4j</artifactId> 
      </exclusion> 
     </exclusions> 
    </dependency> 
</dependencies> 
</project> 
+1

認爲你錯過了@Repository註解 – Jens

+0

後全班你使用其中'MyService'。 – chrylis

+0

請添加您的bean配置 - 我不確定您是使用Java配置還是XML或什麼... – Betlista

回答

2

最後,我不得不在代碼中錯誤的服務正在顯式實例,用new,而不是依賴於Spring的CDI。因此,服務中Repository的@Autowire並沒有被Spring處理。

WRONG

//explicit instantiation. Spring not in charge so no repo injected 
setService(new MyService()); 

RIGHT

//Spring CDI takes charge and autowires the Service and it's dependencies 
@Autowired 
private MyService myService; 

public void someMethod(){ 
    setService(myService); 
} 
0

更改MyRepository類,如下所示:

public interface MyRepository extends JpaRepository<AnEntity, Long> { 
    public AnEntity findOneByData(String data); 
    public AnEntity findOneByIndex(String index); 
} 
+1

確實需要明確要掃描的基本包是沒有必要的。默認情況下,註釋從包裝開始,向包裝樹中向上掃描(朝向樹葉)。如果發現存儲庫是這種情況,Spring會拋出一個錯誤,指出不能連線的未滿足的依賴關係。當應用程序啓動時,情況並非如此。 –