【问题标题】:Unable to query a database through Spring 4 (HTTP 500 Request processing failure)无法通过 Spring 4 查询数据库(HTTP 500 请求处理失败)
【发布时间】: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

其他相关信息:

  1. 我已经在一个单独的简单 Java 应用程序中测试了我的数据库连接,我能够成功连接并返回正确的结果。
  2. 我将我的数据库信息添加到了我的 WEB-INF 文件夹中的 mvc-dispatcher-servlet.xml 和 beans.xml 文件中。
  3. 我没有使用 Oracle 数据库,我的目标是连接到 Vertica 数据库(我已经探索过使用 Hibernate 的可能性)。

问题:如何解决 HTTP 状态 500 问题?据说 rowCount 不适合存储对象,但基于Spring's documentation,据我了解,这是正确的做法。我看过一些类似的问题(SO Question 1SO Question 2CodeRanch 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


【解决方案1】:

您应该设置DatabaseController 的数据源:

<bean id="DatabaseController" class="com.company.project.controller.DatabaseController">
  <property name="databaseDataSource" ref="dataSource"/>
</bean>

或者只是注释你的设置器:

@Autowired
public void setDatabaseDataSource (DataSource dbDataSource) {
    this.jdbcTemplate = new JdbcTemplate(dbDataSource);
}

【讨论】:

  • 谢谢,但是当我尝试使用 ref="dataSource" 时会导致编译错误。怎么会这样?
  • 您发布的代码与我假设的您使用的代码不完全相同。您必须在此处调整答案。
  • 您在DatabaseController 中导入了错误的DataSource。这是javax.sql.DataSource
  • 改编你们给出的答案。我正在尝试使用基于注释的 mvc 控制器。感谢您的所有见解,一旦我正常工作,我会更新所有内容:)
  • @AliDehghani 和 Jeremie,非常感谢你们!我使用了基于注释的 mvc 控制器,它运行良好。花了几天时间,但我很高兴它可以正常工作。我还尝试了连接每个 bean 进行练习的手动方法,并且效果也很好。再次感谢!
【解决方案2】:

您必须将jdbcTemplate 注入您的控制器。

@Autowired注释它,以便Spring可以注入它。

【讨论】:

  • 感谢您的回答!但是,当我使用 @Autowired 注释 jdbcTemplate 时,出现以下错误:嵌套异常是 org.springframework.beans.factory.BeanCreationException:无法自动装配字段:私有 org.springframework.jdbc.core.JdbcTemplate com.bnymellon.ca.controller.databaseController.jdbcTemplate;嵌套异常是 org.springframework.beans.factory.NoSuchBeanDefinitionException
  • 您的 jdbcTemplate 未配置。你必须配置它
猜你喜欢
  • 2015-08-28
  • 1970-01-01
  • 2015-07-11
  • 1970-01-01
  • 1970-01-01
  • 2015-12-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多