每次进入服务类时,存储库似乎都不会自动装配,因为它会不断抛出NullPointerException。谁能帮我检查我想念的是什么?
这是我的代码:
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); } }
人.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"; } }
错误是在控制器中手动实例化PersonService,例如this PersonService ps = new PersonService()。
PersonService ps = new PersonService()
为了使Spring能够自动装配任何东西,您需要使用它所管理的bean,因此,与其在控制器上创建新的PersonService,不如对其自动装配:
@Autowired private PersonService personService;