2016-01-13 109 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会抛出一个错误,指出不能连线的未满足的依赖关系。当应用程序启动时,情况并非如此。 –

相关问题