2014-01-11 103 views
4

不久前,Spring Data中的倉庫在@Controller中工作。將數據訪問權移動到@Service中後,它停止工作。一切看起來都很好....爲什麼這個DI失敗了?Spring Data:Injected repository is null

這裏是我的彈簧配置:

<?xml version="1.0" encoding="UTF-8"?> 
<beans xmlns="http://www.springframework.org/schema/beans" 
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     xmlns:data="http://www.springframework.org/schema/data/jpa" 
     xmlns:mvc="http://www.springframework.org/schema/mvc" 
     xsi:schemaLocation=" 
      http://www.springframework.org/schema/beans 
      http://www.springframework.org/schema/beans/spring-beans-3.0.xsd 
      http://www.springframework.org/schema/mvc 
      http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd 
      http://www.springframework.org/schema/data/jpa 
      http://www.springframework.org/schema/data/jpa/spring-jpa.xsd"> 

    <bean id="jpaVendorAdapter" class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter"> 
     <property name="database" value="POSTGRESQL" /> 
     <property name="databasePlatform" value="org.hibernate.dialect.PostgreSQLDialect" /> 
    </bean> 

    <bean id="jpaDialect" class="org.springframework.orm.jpa.vendor.HibernateJpaDialect" /> 

    <bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager"> 
     <property name="entityManagerFactory" ref="entityManagerFactory" /> 
     <property name="dataSource" ref="dataSource" /> 
     <property name="jpaDialect" ref="jpaDialect" /> 
    </bean> 

    <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"> 
     <property name="driverClassName" value="org.postgresql.Driver" /> 
     <property name="url" value="jdbc:postgresql://localhost:5432/cp" /> 
     <property name="username" value="cp_user" /> 
     <property name="password" value="+JMJ+pw0m2d" /> 
    </bean> 

    <data:repositories base-package="com.mydomain.data.repository" /> 

    <mvc:annotation-driven /> 

</beans> 

我的應用程序:

@ComponentScan 
@EnableAutoConfiguration 
@ImportResource("classpath:spring-config.xml") 
public class Application { 
    public static void main(String[] args) { 
     SpringApplication.run(Application.class, args); 
    } 
} 

我的控制器:

@Controller 
@RequestMapping("/app/user") 
@ExposesResourceFor(User.class) 
public class UserController { 
@RequestMapping(value = "/{userid}", method = RequestMethod.GET, produces = "application/json") 
    @ResponseBody 
    public HttpEntity<UserResource> get(@PathVariable("userid") long id) { 
     ProfileService ps = new ProfileService(); 
     UserResource resource = ps.get(id); 
     return new ResponseEntity<UserResource>(resource, HttpStatus.OK); 
    } 
} 

我的服務:

@Service 
@ExposesResourceFor(User.class) 
public class ProfileService { 

    @Inject 
    private UserRepository users; 

    public UserResource get(long id) { 
     Long longId = new Long(id); 
     User user = users.findOne(longId); // Line 24 

     if (user == null) { 
      throw new ResourceNotFoundException(); 
     } 

     UserMapper assembler = new UserMapper(); 
     UserResource resource = assembler.toResource(user); 

     return resource; 
    } 

    public void update(UserResource resource) { 
     UserMapper assembler = new UserMapper(); 
     User user = assembler.toEntity(resource); 
     users.save(user); 
    } 
} 

引發異常:

java.lang.NullPointerException 
com.mydomain.service.ProfileService.get(ProfileService.java:24) 
com.mydomain.app.web.UserController.get(UserController.java:74) 
sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) 
sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) 
java.lang.reflect.Method.invoke(Unknown Source) 
org.springframework.web.method.support.InvocableHandlerMethod.invoke(InvocableHandlerMethod.java:214) 
org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:132) 
org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:104) 
org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandleMethod(RequestMappingHandlerAdapter.java:748) 
org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:689) 
org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:83) 
org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:947) 
org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:878) 
org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:946) 
org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:837) 
javax.servlet.http.HttpServlet.service(HttpServlet.java:621) 
org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:822) 
javax.servlet.http.HttpServlet.service(HttpServlet.java:728) 
org.springframework.web.filter.HiddenHttpMethodFilter.doFilterInternal(HiddenHttpMethodFilter.java:77) 
org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:108) 

如果ProfileService:24:

User user = users.findOne(longId); 
+0

你從哪裏得到你的'ProfileService'對象?讓我們看看你的'UserController'類。 –

+0

@SotiriosDelimanolis更新後顯示控制器 – Lurk21

回答

10

在你的控制器創建ProfileService實例與new關鍵字,它不是由Spring管理(Spring不知道它並不能注入UserRepository - 這會導致NullPointerException)。您必須將ProfileService注入UserController,方法與將UserRepository注入ProfileService相同。例如:

@Controller 
@RequestMapping("/app/user") 
@ExposesResourceFor(User.class) 
public class UserController { 

    @Autowired 
    private ProfileService profileService; 

    @RequestMapping(value = "/{userid}", method = RequestMethod.GET, produces = "application/json") 
    @ResponseBody 
    public HttpEntity<UserResource> get(@PathVariable("userid") long id) { 
     UserResource resource = profileService.get(id); 
     return new ResponseEntity<UserResource>(resource, HttpStatus.OK); 
    } 
} 
+0

當然,我現在明白了。謝謝! – Lurk21