2016-04-16 20 views
1

私はサービスクラス内に入るたびに、NullPointerExceptionをスローし続けるので、リポジトリはAutowiredに見えません。誰かが私が行方不明であることを確認するのに役立つことができる?ここでSpringブートAutowiringリポジトリ常にNull

は私のコードです:

DemoApplication.java

package com.example; 

import org.springframework.boot.SpringApplication; 
import org.springframework.boot.autoconfigure.EnableAutoConfiguration; 
import org.springframework.boot.autoconfigure.SpringBootApplication; 
import org.springframework.boot.orm.jpa.EntityScan; 
import org.springframework.context.annotation.ComponentScan; 
import org.springframework.context.annotation.Configuration; 
import org.springframework.data.jpa.repository.config.EnableJpaRepositories; 
import org.springframework.stereotype.Controller; 
import org.springframework.transaction.annotation.EnableTransactionManagement; 
import org.springframework.web.bind.annotation.RequestMapping; 
import org.springframework.web.bind.annotation.ResponseBody; 

@Configuration 
@EnableAutoConfiguration 
@ComponentScan({"com.example", "com.controller", "com.repositories", "com.service", "com.model"}) 
@EntityScan(basePackages = {"com.model"}) 
@EnableJpaRepositories(basePackages = {"com.repositories"}) 
@EnableTransactionManagement 
public class DemoApplication { 

    public static void main(String[] args) { 
     SpringApplication.run(DemoApplication.class, args); 
    } 
} 

Person.java

package com.model; 

import javax.persistence.Entity; 
import javax.persistence.GeneratedValue; 
import javax.persistence.GenerationType; 
import javax.persistence.Id; 

@Entity 
public class Person { 

    @Id 
    @GeneratedValue(strategy=GenerationType.AUTO) 
    long id; 

    String firstName; 

    String lastName; 

    public String getFirstName() { 
     return firstName; 
    } 
    public void setFirstName(String firstName) { 
     this.firstName = firstName; 
    } 
    public String getLastName() { 
     return lastName; 
    } 
    public void setLastName(String lastName) { 
     this.lastName = lastName; 
    } 
} 

PersonRepository.java

package com.repositories; 

import com.model.Person; 
import org.springframework.data.repository.CrudRepository; 

public interface PersonRepository extends CrudRepository<Person, Long> { 

} 

PersonService.java

package com.service; 

import org.springframework.beans.factory.annotation.Autowired; 
import org.springframework.stereotype.Service; 

import java.util.List; 


import com.model.Person; 
import com.repositories.PersonRepository; 


@Service 
public class PersonService { 

    private PersonRepository pr; 

    @Autowired 
    public void setPersonRepository(PersonRepository pr) { 
     this.pr = pr; 
    } 

    public List<Person> listAll() { 
     return null; 

    } 

    public Person getByName(String firstName, String lastName) { 
     return null; 
    } 

    public Person saveOrUpdate(Person p) { 
     pr.save(p); 
     return p; 
    } 

} 

application.properties

spring.datasource.url:jdbc:h2:mem:testdb 
spring.datasource.username=sa 
spring.datasource.password= 
spring.datasource.driverClassName=org.h2.Driver 

のpom.xml

<?xml version="1.0" encoding="UTF-8"?> 
<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/xsd/maven-4.0.0.xsd"> 
    <modelVersion>4.0.0</modelVersion> 

    <groupId>com.example</groupId> 
    <artifactId>demo</artifactId> 
    <version>0.0.1-SNAPSHOT</version> 

    <name>demo</name> 
    <description>Demo project for Spring Boot</description> 

    <parent> 
     <groupId>org.springframework.boot</groupId> 
     <artifactId>spring-boot-starter-parent</artifactId> 
     <version>1.3.3.RELEASE</version> 
     <relativePath/> <!-- lookup parent from repository --> 
    </parent> 

    <properties> 
     <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> 
     <java.version>1.7</java.version> 
    </properties> 

    <dependencies> 
     <dependency> 
      <groupId>org.springframework.boot</groupId> 
      <artifactId>spring-boot-starter-web</artifactId> 
     </dependency> 

     <dependency> 
      <groupId>org.springframework.boot</groupId> 
      <artifactId>spring-boot-starter-test</artifactId> 
      <scope>test</scope> 
     </dependency> 
     <dependency> 
      <groupId>org.springframework.boot</groupId> 
      <artifactId>spring-boot-starter-thymeleaf</artifactId> 
     </dependency> 
     <dependency> 
      <groupId>org.hibernate.javax.persistence</groupId> 
      <artifactId>hibernate-jpa-2.1-api</artifactId> 
      <version>1.0.0.Final</version> 
     </dependency> 

     <dependency> 
      <groupId>org.eclipse.persistence</groupId> 
      <artifactId>javax.persistence</artifactId> 
      <version>2.0.0</version> 
      <scope>compile</scope> 
     </dependency> 

     <dependency> 
      <groupId>com.h2database</groupId> 
      <artifactId>h2</artifactId> 
      <scope>runtime</scope> 
     </dependency> 

     <dependency> 
      <groupId>org.springframework.boot</groupId> 
      <artifactId>spring-boot-starter-data-jpa</artifactId> 
     </dependency> 
    </dependencies> 

    <build> 
     <plugins> 
      <plugin> 
       <groupId>org.springframework.boot</groupId> 
       <artifactId>spring-boot-maven-plugin</artifactId> 
      </plugin> 
     </plugins> 
    </build> 


</project> 

PersonController.java

package com.controller; 

import javax.servlet.http.HttpServletRequest; 

import org.springframework.stereotype.Controller; 
import org.springframework.ui.Model; 
import org.springframework.ui.ModelMap; 
import org.springframework.validation.BindingResult; 
import org.springframework.web.bind.annotation.ModelAttribute; 
import org.springframework.web.bind.annotation.RequestMapping; 
import org.springframework.web.bind.annotation.RequestMethod; 
import org.springframework.web.bind.annotation.ResponseBody; 
import org.springframework.web.bind.support.SessionStatus; 

import com.model.Person; 
import com.service.PersonService; 

@Controller 
public class PersonController { 
    @RequestMapping("/person") 
    public String person(Model model) { 
     PersonService ps = new PersonService(); 
     Person p = ps.getByName("John", "Doe"); 
     model.addAttribute("person", p); 
     return "personview"; 
    } 




    @RequestMapping(value = "/", method = RequestMethod.GET) 
    public String getHomePage() { 
     return "homeview"; 
    } 

    @RequestMapping(value = "/add", method = RequestMethod.GET) 
    public String getRegFormPage(ModelMap model) { 
     model.addAttribute("person", new Person()); 
     return "addpersonview"; 
    } 

    @RequestMapping(value="/add", method = RequestMethod.POST) 
    public String processRegFormPage(ModelMap model, @ModelAttribute("person") Person p, BindingResult result, SessionStatus status, HttpServletRequest request) throws Exception { 
      PersonService ps = new PersonService(); 
      ps.saveOrUpdate(p); 

      model.addAttribute("person", p); 
      return "personview"; 
     } 
} 

答えて

3

このエラーは、PersonService ps = new PersonService()のように、コントローラでPersonServiceを手動でインスタンス化しています。春は何かをautowireすることができるようにするために

、あなたはそれによって管理対象Beanを使用する必要があるので、代わりにあなたのコントローラ上の新しいPersonServiceを作成するのではなく、それをautowire:コントローラにサービスの配線

@Autowired 
private PersonService personService; 
+0

がそれを解決しましたそのことを心に留めておきます。 – aldrynshopping

+0

@dambros私たちの洞察力を共有してくれてありがとう、 これは私にとってもうまくいった。 あなたは私の一日を保存しました –

2

あなたはそれを作るのではなく、あなたのコントローラであなたのPersonServiceクラスをautowire必要がありますオブジェクトとして。

関連する問題