【发布时间】:2016-02-26 20:08:14
【问题描述】:
要解决的问题:我正在构建一个 Spring MVC 应用程序并希望与我的数据库进行交互。
方法:首先,我构建了一个简单的映射,当调用它时,将我的数据库中指定表中的项目数打印到控制台。
我的代码如下:
@Controller
@RequestMapping("/databaseName")
public class DatabaseController {
private JdbcTemplate jdbcTemplate;
public void setDatabaseDataSource (DataSource dbDataSource) {
this.jdbcTemplate = new JdbcTemplate(dbDataSource);
}
@RequestMapping(value = "/getSomeCountOfElementsInMyTable", method = RequestMethod.GET)
public void getSomeTable() {
System.out.println("SELECT count(*) FROM TEST_TABLE is now being executed...");
int rowCount = this.jdbcTemplate.queryForObject("SELECT count(*) FROM TEST_TABLE", Integer.class);
System.out.println(rowCount);
}
}
beans.xml(请记住,我更改了这篇文章的数据库凭据。假设它们是正确的。)
<?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:beans="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd">
<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
<property name="dataSource" ref="dataSource"></property>
</bean>
<bean id="DatabaseController" class="com.company.project.controller.DatabaseController"/>
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="com.database.jdbc.Driver"/>
<property name="url" value="some_url_here"/>
<property name="username" value="user"/>
<property name="password" value="pw"/>
</bean>
</beans>
基于方法面临的问题:我通过 Postman 连接时收到以下错误:
HTTP Status 500 - Request processing failed; nested exception is java.lang.NullPointerException
type Exception report
message Request processing failed; nested exception is java.lang.NullPointerException
description The server encountered an internal error that prevented it from fulfilling this request.
exception
org.springframework.web.util.NestedServletException: Request processing failed; nested exception is java.lang.NullPointerException
org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:982)
org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:861)
javax.servlet.http.HttpServlet.service(HttpServlet.java:620)
org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:846)
javax.servlet.http.HttpServlet.service(HttpServlet.java:727)
org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
root cause
java.lang.NullPointerException
com.company.project.controller.DatabaseController.getSomeTable(DatabaseController.java:44)
sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
java.lang.reflect.Method.invoke(Method.java:497)
org.springframework.web.bind.annotation.support.HandlerMethodInvoker.invokeHandlerMethod(HandlerMethodInvoker.java:178)
org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.invokeHandlerMethod(AnnotationMethodHandlerAdapter.java:444)
org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.handle(AnnotationMethodHandlerAdapter.java:432)
org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:959)
org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:893)
org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:970)
org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:861)
javax.servlet.http.HttpServlet.service(HttpServlet.java:620)
org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:846)
javax.servlet.http.HttpServlet.service(HttpServlet.java:727)
org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
note The full stack trace of the root cause is available in the Apache Tomcat/7.0.52 logs.
Apache Tomcat/7.0.52
其他相关信息:
- 我已经在一个单独的简单 Java 应用程序中测试了我的数据库连接,我能够成功连接并返回正确的结果。
- 我将我的数据库信息添加到了我的 WEB-INF 文件夹中的 mvc-dispatcher-servlet.xml 和 beans.xml 文件中。
- 我没有使用 Oracle 数据库,我的目标是连接到 Vertica 数据库(我已经探索过使用 Hibernate 的可能性)。
问题:如何解决 HTTP 状态 500 问题?据说 rowCount 不适合存储对象,但基于Spring's documentation,据我了解,这是正确的做法。我看过一些类似的问题(SO Question 1、SO Question 2 和 CodeRanch Question 3)。我确实看到了对 DAO 的引用,但不理解为什么需要它,因为它与我对 Spring 文档的理解相冲突。
【问题讨论】:
-
你有一个 NPE,这与 db 配置或任何东西无关。请发布“DatabaseController.getSomeTable”的代码,但您可能没有注入强制依赖项。
-
@JérémieB 看起来我在创建问题时拼错了自己的函数调用。我确实注入了依赖项,但尽管配置了它,但我遇到了麻烦。我也用 beans.xml 文件编辑了我的问题。
-
我没有看到你的 beans.xml
-
@AliDehghani 我同意你的观点 ;-) 我只是在严格回答这个问题
-
@Abhi IMO 如果您是 Spring 新手,最好从 Spring Boot 开始。在获得越来越多的启动经验后,您可以更有信心地玩底层启动魔法(MVC、安全、数据等)。 Spring 项目通常有很好的文档,因此您可以研究它们,也可以使用它们的 github 示例项目。
标签: java spring spring-mvc spring-security