easthedge 2017-07-08 04:21 采纳率: 0%
浏览 2218

dbutils插入数据到mysql数据库报莫名其妙地NullpointerException

web层
public class BaseServlet extends HttpServlet {

@Override
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    try {
        //获取子类字节码对象
        Class clazz = this.getClass();
        System.out.println(this);

        //获取method方法名参数,作为获取方法对象的参数
        String m = request.getParameter("method");
        if(m==null){
            m="index";
        }
        System.out.println(m);

        //获取方法对象
        Method method = clazz.getMethod(m, HttpServletRequest.class, HttpServletResponse.class);

        //让方法执行,返回值为请求转发路径
        String s = (String) method.invoke(this, request, response);
        System.out.println(s);
        //判断次路径是否为空,不为空请求转发到次路径
        if(s != null){
            request.getRequestDispatcher(s).forward(request, response);
        }
    } catch (Exception e) {
        e.printStackTrace();
        throw new RuntimeException();
    }


}

public class OrderServlet extends BaseServlet {

/**
 * 生成订单
 * @param request
 * @param response
 * @return
 * @throws Exception
 */
public String add(HttpServletRequest request, HttpServletResponse response) throws Exception {
    //0判断用户是否登录
    User user = (User) request.getSession().getAttribute("user");
    if(user == null) {
        request.setAttribute("msg", "请先登录~~~~~");
        return "/jsp/msg.jsp";
    }

    //1封装数据
    Order order = new Order();

    //1.1 封装订单id
    order.setOid(UUIDUtils.getId());

    //1.2封装订单时间
    order.setOrderTime(new Date());

    //1.3封装订单金额
    //获取session中的购物车
    Cart cart = (Cart) request.getSession().getAttribute("cart");
    order.setTotal(cart.getTotalPrice());

    //1.4封装订单项    
    //从购物车中获取购物车项,遍历购物车中的购物车项,得到每个订单项中的数据
    for (CartItem cartItem : cart.getCartItem()) {
        OrderItem  oi = new OrderItem();
        //设置订单项id
        oi.setItemid(UUIDUtils.getId());
        //设置订单项包含的商品
        oi.setProduct(cartItem.getProduct());
        //设置包含于那个订单
        oi.setOrder(order);
        //设置订单项中的商品数
        oi.setCount(cartItem.getCount());
        //设置定单项的小计
        oi.setSubTotal(cartItem.getSubTotal());

        //添加订单项到order对 象中
        order.getItems().add(oi);
    }

    //1.5设置用户
    order.setUser(user);


    //调用service,完成对订单的添加

     OrderService os = (OrderService) BeanFactory.getBean("OrderService");
     os.add(order);



    //将order对象放入request域
    request.setAttribute("order", order);

    //将以前的购物车中的东西,即将以前的从购物车清除了
    request.getSession().removeAttribute("cart");

    //请求转发到订单详情页面
    return "/jsp/order_info.jsp";
}

}
service层

public interface OrderService {

void add(Order order) throws Exception;

}

public class OrderServiceImpl implements OrderService {
/**
* 将订单数据添加到数据库中
* @throws Exception
*/
@Override
public void add(Order order) throws Exception{

    try {
        //1对者两个添加要加入事务
        DataSourceUtils.startTransaction();

        //2在order添加一条数据
        OrderDao od  = (OrderDao) BeanFactory.getBean("OrderDao");
        od.add2Order(order);
        //在orderitem中添加n条数据
        for (OrderItem oi : order.getItems()) {
            od.add2OrderItem(oi);           
        }
        //提交事务
        DataSourceUtils.commitAndClose();
    } catch (Exception e) {
        e.printStackTrace();
        //事务回滚
        DataSourceUtils.rollbackAndClose();
        throw e;
    }

}

}

dao层

public interface OrderDao {

void add2Order(Order order) throws Exception;

void add2OrderItem(OrderItem oi) throws Exception;

}

public class OrderDaoImpl implements OrderDao{
/**
* 添加一条订单
/
@Override
public void add2Order(Order order) throws SQLException {
QueryRunner qr = new QueryRunner();
String sql = "insert into order values(?, ?, ?, ?, ?, ?, ?, ?)";
qr.update(DataSourceUtils.getConnection(), sql, order.getOid(), order.getOrderTime(), order.getTotal(),
order.getState(), order.getAddress(), order.getName(),
order.getPhone(), order.getUser().getUid());
}
/
*
* 添加一条订单项
*/
@Override
public void add2OrderItem(OrderItem oi) throws SQLException {
QueryRunner qr = new QueryRunner();
String sql = "insert into orderitem values(?, ?, ?, ?, ?)";
qr.update(DataSourceUtils.getConnection(),sql, oi.getItemid(), oi.getCount(), oi.getSubTotal(), oi.getProduct().getPid(), oi.getOrder().getOid());

}

}

出错后jsp页面显示不出,所报异常
java.lang.NullPointerException
at com.mysql.jdbc.ResultSetMetaData.getField(ResultSetMetaData.java:397)
at com.mysql.jdbc.ResultSetMetaData.getColumnType(ResultSetMetaData.java:275)
at com.mysql.jdbc.MysqlParameterMetadata.getParameterType(MysqlParameterMetadata.java:80)
at org.apache.commons.dbutils.AbstractQueryRunner.fillStatement(AbstractQueryRunner.java:197)
at org.apache.commons.dbutils.QueryRunner.update(QueryRunner.java:485)
at org.apache.commons.dbutils.QueryRunner.update(QueryRunner.java:402)
at com.local.dao.OrderDaoImpl.add2Order(OrderDaoImpl.java:19)
at com.local.service.OrderServiceImpl.add(OrderServiceImpl.java:28)
at com.local.web.servlet.OrderServlet.add(OrderServlet.java:82)
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 com.local.web.servlet.BaseServlet.service(BaseServlet.java:36)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:727)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:303)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
at com.local.web.filter.EncodingFilter.doFilter(EncodingFilter.java:36)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:220)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:122)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:501)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:170)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:98)
at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:950)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:116)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:408)
at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1040)
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:607)
at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:315)
at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
at java.lang.Thread.run(Unknown Source)
java.lang.reflect.InvocationTargetException
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 com.local.web.servlet.BaseServlet.service(BaseServlet.java:36)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:727)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:303)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
at com.local.web.filter.EncodingFilter.doFilter(EncodingFilter.java:36)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:220)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:122)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:501)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:170)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:98)
at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:950)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:116)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:408)
at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1040)
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:607)
at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:315)
at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
at java.lang.Thread.run(Unknown Source)
Caused by: java.lang.NullPointerException
at com.mysql.jdbc.ResultSetMetaData.getField(ResultSetMetaData.java:397)
at com.mysql.jdbc.ResultSetMetaData.getColumnType(ResultSetMetaData.java:275)
at com.mysql.jdbc.MysqlParameterMetadata.getParameterType(MysqlParameterMetadata.java:80)
at org.apache.commons.dbutils.AbstractQueryRunner.fillStatement(AbstractQueryRunner.java:197)
at org.apache.commons.dbutils.QueryRunner.update(QueryRunner.java:485)
at org.apache.commons.dbutils.QueryRunner.update(QueryRunner.java:402)
at com.local.dao.OrderDaoImpl.add2Order(OrderDaoImpl.java:19)
at com.local.service.OrderServiceImpl.add(OrderServiceImpl.java:28)
at com.local.web.servlet.OrderServlet.add(OrderServlet.java:82)
... 28 more
七月 08, 2017 12:01:24 下午 org.apache.catalina.core.StandardWrapperValve invoke
严重: Servlet.service() for servlet [OrderServlet] in context with path [/store] threw exception
java.lang.RuntimeException
at com.local.web.servlet.BaseServlet.service(BaseServlet.java:44)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:727)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:303)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
at com.local.web.filter.EncodingFilter.doFilter(EncodingFilter.java:36)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:220)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:122)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:501)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:170)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:98)
at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:950)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:116)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:408)
at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1040)
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:607)
at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:315)
at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
at java.lang.Thread.run(Unknown Source)

com.local.web.servlet.OrderServlet@8bc0b9
add

我用debug方式看了看了下order在dao用dbutils插入时的数据,数据是封装进去的,就name,address,phone,三项没有封装。并已经接图。以前在mysql中插入数据页是可以插入空数值的,
为何会报NullPointerException,困扰了好些时候了,各位大神有时间的话帮着看一下呀!

  • 写回答

4条回答 默认 最新

  • engchina 2017-07-08 08:45
    关注

    1,如果你要自己调查的话,
    可以下载dbutils和mysql driver的source,
    然后在,com.mysql.jdbc.ResultSetMetaData.getField(ResultSetMetaData.java:397) 设断点,
    一点点反查问题。

    2,如果你要自己调查的话, 修改add2Order里的,
    修改前

    qr.update(DataSourceUtils.getConnection(), sql, order.getOid(), order.getOrderTime(), order.getTotal(), 
    order.getState(), order.getAddress(), order.getName(),
    order.getPhone(), order.getUser().getUid()); 
    

    修改后

    qr.update(DataSourceUtils.getConnection(), "insert into testtable values (?)", "1");
    

    建表语句

    CREATE TABLE `demo`.`testtable` (
      `id` VARCHAR(45) NOT NULL,
      PRIMARY KEY (`id`));
    

    试下上面的语句是否好用。

    3,如果想让大家一起分析下的话,
    提供下dbutils和mysql driver的版本。
    提供下order建表语句。

    评论

报告相同问题?

悬赏问题

  • ¥15 gwas 分析-数据质控之过滤稀有突变中出现的问题
  • ¥15 没有注册类 (异常来自 HRESULT: 0x80040154 (REGDB_E_CLASSNOTREG))
  • ¥15 知识蒸馏实战博客问题
  • ¥15 用PLC设计纸袋糊底机送料系统
  • ¥15 simulink仿真中dtc控制永磁同步电机如何控制开关频率
  • ¥15 用C语言输入方程怎么
  • ¥15 网站显示不安全连接问题
  • ¥15 51单片机显示器问题
  • ¥20 关于#qt#的问题:Qt代码的移植问题
  • ¥50 求图像处理的matlab方案