【问题标题】:Getting null pointer exception while getting from mysql db从mysql db获取时出现空指针异常
【发布时间】:2016-08-16 18:46:41
【问题描述】:

大家好,我正在使用 rest 和 mysql 作为我的数据库。

以下是我获取所有书籍(资源)的其余获取代码

@GET
@Produces(MediaType.APPLICATION_JSON)
public Response getBooks(@QueryParam("format") String format) {

    //line35: return Response.status(Status.OK).entity((new GenericEntity<List<Book>>(bookService.getAllBooks()) {
    })).header(HttpHeaders.CONTENT_TYPE, "XML".equalsIgnoreCase(format)
            ? MediaType.APPLICATION_XML + ";charset=UTF-8" : MediaType.APPLICATION_JSON + ";charset=UTF-8").build();

}

以下是我的服务

public List<Book> getAllBooks() {

    //books service line 24 return new ArrayList<Book>(booksDao.getAllBooks());
    /* return new ArrayList<Book>(books.values()); */
}

BooksDAO 类

public class BooksDAO {

private JdbcTemplate jdbcTemplate;

public void setJdbcTemplate(JdbcTemplate jdbcTemplate) {
    this.jdbcTemplate = jdbcTemplate;
}

public List<Book> getAllBooks() {
    //books dao line24: return jdbcTemplate.query("select * from books.books_table", new RowMapper<Book>() {

        @Override
        public Book mapRow(ResultSet rs, int rownumber) throws SQLException {
            Book e = new Book();
            e.setId(rs.getInt(1));

            e.setName(rs.getString(2));

            e.setPrice(rs.getString(3));

            e.setAuthor(rs.getString(4));

            return e;
        }


    });
}

下面是我的bean。我正在使用springJDBC

<?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:p="http://www.springframework.org/schema/p"  
xsi:schemaLocation="http://www.springframework.org/schema/beans   
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">  

<bean id="ds" 
class="org.springframework.jdbc.datasource.DriverManagerDataSource"> 
<property name="driverClassName" value="com.mysql.jdbc.Driver" />  
<property name="url" value="jdbc:mysql://localhost:3306/xxxx" />  
<property name="username" value="xxxx" />  
<property name="password" value="xxxx" />  
</bean>  

<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">  
<property name="dataSource" ref="ds"></property>  
</bean>  

<bean id="edao" class="com.nag.library.database.BooksDAO">  
<property name="jdbcTemplate" ref="jdbcTemplate"></property>  
</bean>  

</beans> 

如果不连接到 db,我可以得到 json/xml 响应,但是当我连接 db 时,它会抛出空指针异常

Aug 16, 2016 10:43:08 AM org.apache.catalina.core.StandardWrapperValve
invoke     
SEVERE: Servlet.service() for servlet Jersey Web Application threw exception
java.lang.NullPointerException
at com.nag.library.database.BooksDAO.getAllBooks(BooksDAO.java:24)
at com.nag.library.service.BookService.getAllBooks(BookService.java:24)
at com.nag.library.resource.BookResource.getBooks(BookResource.java:35)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at java.lang.Thread.run(Unknown Source)

我在哪里做错了。请指导我。

谢谢

【问题讨论】:

  • 您在哪条指令上有 NPE ?您应该显示所有 BooksDAO 类
  • NPE?你能详细说明一下吗。对不起,我只是一个学习者。
  • 没问题:NPE=NullPointerException
  • 我已经更新了 booksdao 类,当我在 book dao 中返回 jdbc.query 时,我得到了空指针异常。当我编写一个主要方法并执行时,我从表中获取了所有值。但我是无法恢复休息
  • "com.nag.library.database.BooksDAO.getAllBooks(BooksDAO.java:24)" 这意味着错误发生在BooksDAO.java的第24行。那是哪条线?

标签: java mysql spring rest


【解决方案1】:

我认为问题在于您的服务不是 Spring 管理的 bean,因为没有在您的 spring conf 中声明。 所以你不要使用这些豆子:

<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">  
<property name="dataSource" ref="ds"></property>  
</bean>  

<bean id="edao" class="com.nag.library.database.BooksDAO">  
<property name="jdbcTemplate" ref="jdbcTemplate"></property>  
</bean>  

因此,您的jdbcTemplace 是您在运行时使用的BooksDAO 中的null。
在此配置中将您的服务添加为 bean,并将 bean edao 作为属性添加到其中。
您还应该将您的服务与您的休息类联系起来。

为精确而编辑:我认为问题出在这里,因为在这一行 return jdbcTemplate.query("‌​select * from books.books_table", new RowMapper&lt;Book&gt;() NullPointerException 可能有一个原因:jdbcTemplate 为空。此外,您没有在他的配置中声明服务 bean。此外,方法体中的任何指令都不会触发NPE。 ——

【讨论】:

  • 他之前告诉过 jdbcTemplate 的实例不为空,我之前的想法和你一样,但是如果声明 bean 有问题,如果服务类上的实例是,调用如何到达 dao没有自动接线?
  • 不是逻辑。在这一行return jdbcTemplate.query("select * from books.books_table", new RowMapper&lt;Book&gt;() 中,空指针可能只有一个原因:jdbcTemplate is null。此外,他没有在他的配置中声明服务 bean。此外,方法体中的任何指令都不会触发NPE。
  • 我没有看到你编辑了你的评论。也许,他用new() 实例化它,或者他使用另一个自动装配的 dao 实例。真诚的,我不知道,但 NPE 是 bean 接线问题,不是 SQL 问题。
【解决方案2】:

我认为你在 dao 的映射有问题,你能发布带有行号的代码来确定我的怀疑吗?没有行号,我们无法确定带有 Nullpointer 的行 (24) .

首先,如果我是你,我会尝试按名称 (getString("COLUMN_NAME")) 而不是索引来映射表的字段,以检查列(索引或数据类型)是否有问题。

最后,如果这不起作用,请尝试将一个空对象映射为映射器结果,以检查它是否是查询的问题。

大功告成

【讨论】:

  • 当我编写一个主方法并执行时,我从表中获取了所有值。但我无法将其返回给休息
  • 这很奇怪,因为执行查询时出错,你使用不同的配置xmls吗?
  • 希望是的,当我打印它返回值的对象时
  • 不,我没有使用任何不同的东西。
  • 好的,你能用这个方法docs.spring.io/spring/docs/current/javadoc-api/org/…代替你当前的方法来检查是否出现了不同的跟踪
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-01-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多