2016-02-09 37 views
0

我是Spring的新手。我正在嘗試使用Spring web MVC開發REST API。我試圖從我的數據庫(MySQL)使用JdbcTemplate獲取一些數據。但是當我運行服務器中的代碼時,我得到500- Internal Server Error,堆棧跟蹤顯示java.lang.NullPointerException。當我試圖調試代碼時,我發現jdbcTemplate變量具有空值。我已經嘗試了網絡中提供的每個解決方案,但仍然得到相同的錯誤。jdbcTemplate爲空並拋出空指針異常

這裏是我的的applicationContext.xml文件

<context:component-scan base-package="com.cinema.repository" /> 


    <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate"> 
     <property name="dataSource" ref="dataSource" /> 
    </bean> 
    <bean id="userDao" class="com.cinema.repository.UserDaoImpl"> 
     <property name="jdbcTemplate" ref="jdbcTemplate" /> 
    </bean> 
    <bean id="dataSource" 
    class="org.springframework.jdbc.datasource.DriverManagerDataSource"> 
     <property name="driverClassName" value="${jdbc.driverClassName}" /> 
     <property name="url" value="${jdbc.url}" /> 
     <property name="username" value="${jdbc.username}" /> 
     <property name="password" value="${jdbc.password}" /> 
    </bean> 

    <context:property-placeholder location="/WEB-INF/jdbc.properties" /> 

UserDaoImpl.java看起來是:

public class UserDaoImpl implements UserDao { 
private JdbcTemplate jdbcTemplate; 

public JdbcTemplate getJdbcTemplate() { 
    return jdbcTemplate; 
} 
@Autowired 
public void setJdbcTemplate(JdbcTemplate jdbcTemplate) { 
    this.jdbcTemplate = jdbcTemplate; 
} 

public User getUser(int userId) { 
    String sql ="SELECT * FROM user_tbl WHERE user_id = ?"; 
    return this.jdbcTemplate.queryForObject(sql,new Object[]{new Integer(userId)}, new UserMapper()); 
} 

private static final class UserMapper implements RowMapper<User>{ 
    public User mapRow(ResultSet rs, int rowCount) throws SQLException { 
     User u = new User(); 
     u.setUserId(rs.getInt("user_id")); 
     u.setUserName(rs.getString("username")); 
     u.setPassword(rs.getString("password")); 
     u.setEmailId(rs.getString("email")); 
     u.setRole(rs.getString("role")); 
     return u; 
    } 
    } 
} 

我的控制器類是UserController.java

@RestController 
@RequestMapping(value="/user") 
public class UserController { 
    @RequestMapping(method = RequestMethod.GET, value="/{userId}", produces = {MediaType.APPLICATION_JSON_VALUE}) 
    ResponseEntity<User> getUser(@PathVariable int userId){ 
     UserDaoImpl user = new UserDaoImpl(); 
     User u = new User(); 
     u=user.getUser(userId); 
     return new ResponseEntity<User>(u, HttpStatus.OK); 
    } 
} 

和我收到下面的堆棧跟蹤,同時運行的應用程序:

10-Feb-2016 02:50:28.165 SEVERE [tomcat-http--5] org.apache.catalina.core.StandardWrapperValve.invoke Servlet.service() for servlet [spring] in context with path [/booking] threw exception [Request processing failed; nested exception is java.lang.NullPointerException] with root cause 
java.lang.NullPointerException 
at com.cinema.repository.UserDaoImpl.getUser(UserDaoImpl.java:31) 
at com.cinema.web.UserController.getUser(UserController.java:21) 
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
at java.lang.reflect.Method.invoke(Method.java:498) 
at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:222) 
at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:137) 
at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:110) 
at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:814) 
at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:737) 
at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:85) 
at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:959) 
at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:893) 
at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:969) 
at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:860) 
at javax.servlet.http.HttpServlet.service(HttpServlet.java:622) 
at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:845) 
at javax.servlet.http.HttpServlet.service(HttpServlet.java:729) 
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:291) 
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) 
at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52) 
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:239) 
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) 
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:219) 
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:106) 
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:502) 
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:142) 
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:79) 
at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:616) 
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:88) 
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:518) 
at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1091) 
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:673) 
at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:277) 
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) 
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) 
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) 
at java.lang.Thread.run(Thread.java:745) 

請告訴我,我在做什麼錯在這裏。我一直堅持這個問題一個星期了,仍然無法讓我的代碼工作。提前致謝。

回答

3

在你的控制器,你正在創建一個新的一個UserDAOImpl:

@RequestMapping(method = RequestMethod.GET, value="/{userId}", produces = {MediaType.APPLICATION_JSON_VALUE}) 
ResponseEntity<User> getUser(@PathVariable int userId){ 
    UserDaoImpl user = new UserDaoImpl(); // <-- HERE 
    User u = new User(); 
    u=user.getUser(userId); 
    return new ResponseEntity<User>(u, HttpStatus.OK); 
} 

這在UserDAOImpl不是由Spring管理,並且沒有配置/自動裝配。 你應該在你的控制器注入在XML配置的userDAO的實例:

@Autowired 
    private UserDao userDao; 

    @RequestMapping(method = RequestMethod.GET, value="/{userId}", produces = {MediaType.APPLICATION_JSON_VALUE}) 
ResponseEntity<User> getUser(@PathVariable int userId){ 
    User u = userDao.getUser(userId); 
    return new ResponseEntity<User>(u, HttpStatus.OK); 
} 
+0

右鍵 - 呼喚新的,春天不參與;你從此承擔責任。這完全或者完全沒有:Spring處理創建和DI,或者你做。 – duffymo

0

嘗試這些變化:

@Repository("userDao") 
public class UserDaoImpl implements UserDao { 

    @Autowired 
    private JdbcTemplate jdbcTemplate; 

    // Rest of your stuff here. 
}