将业务层改写为单例模式出现空指针异常

来源:5-2 项目作业

Wonwayshon

2021-02-05 15:47:00

我用debug追踪到似乎是CategoryController中属性位置

CategoryBizImpl.getInstance()

部分的问题,麻烦老师帮忙看看如何解决。

05-Feb-2021 15:35:40.662 涓ラ噸 [http-nio-8080-exec-4] org.apache.catalina.core.StandardWrapperValve.invoke 鍦ㄨ矾寰勪负/imoocBook鐨勪笂涓嬫枃涓紝Servlet[globalController]鐨凷ervlet.service锛堬級寮曞彂浜嗗叿鏈夋牴鏈師鍥犵殑寮傚父Servlet鎵ц鎶涘嚭涓�涓紓甯�
java.lang.NullPointerException
at com.imooc.ibook.global.DaoFactory.getDao(DaoFactory.java:32)
at com.imooc.ibook.biz.impl.CategoryBizImpl.<clinit>(CategoryBizImpl.java:11)
at com.imooc.ibook.controller.CategoryController.<init>(CategoryController.java:14)
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
at java.lang.Class.newInstance(Class.java:442)
at com.imooc.ibook.global.GlobalController.service(GlobalController.java:36)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
at com.imooc.ibook.global.CharacterEncodingFilter.doFilter(CharacterEncodingFilter.java:25)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:199)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:97)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:543)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:143)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:81)
at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:690)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:78)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:343)
at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:616)
at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65)
at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:818)
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1626)
at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
at java.lang.Thread.run(Thread.java:748)

package com.imooc.ibook.controller;

import com.imooc.ibook.biz.CategoryBiz;
import com.imooc.ibook.biz.impl.CategoryBizImpl;
import com.imooc.ibook.entity.Category;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.List;

public class CategoryController {
private CategoryBiz categoryBiz=CategoryBizImpl.getInstance();

//list.do
public void list(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
List<Category> categoryList=categoryBiz.getAllCategoried();
request.setAttribute("categoryList",categoryList);
request.getRequestDispatcher("/WEB-INF/pages/admin/category_list.jsp").forward(request,response);
}

//toAdd.do
public void toAdd(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.getRequestDispatcher("/WEB-INF/pages/admin/category_add.jsp").forward(request,response);
}

//add.do
public void add(HttpServletRequest request, HttpServletResponse response) throws IOException {
String name=request.getParameter("name");
Category category=new Category();
category.setName(name);
categoryBiz.addCategory(category);
response.sendRedirect(request.getContextPath()+"/admin/Category/list.do");
}

//delete.do
public void delete(HttpServletRequest request, HttpServletResponse response) throws IOException {
String id=request.getParameter("id");
categoryBiz.deleteCategory(Integer.parseInt(id));
response.sendRedirect(request.getContextPath()+"/admin/Category/list.do");
}
}
package com.imooc.ibook.biz.impl;

import com.imooc.ibook.biz.CategoryBiz;
import com.imooc.ibook.dao.CategoryDao;
import com.imooc.ibook.entity.Category;
import com.imooc.ibook.global.DaoFactory;

import java.util.List;

public class CategoryBizImpl implements CategoryBiz {
private static CategoryDao categoryDao=DaoFactory.getInstance().getDao(CategoryDao.class);
private static CategoryBizImpl categoryBizImpl;

private CategoryBizImpl(){};

public static CategoryBizImpl getInstance(){
if(categoryBizImpl==null){
categoryBizImpl=new CategoryBizImpl();
}
return categoryBizImpl;
}

@Override
public List<Category> getAllCategoried() {
return categoryDao.selectAllCategories();
}

@Override
public void addCategory(Category category) {
categoryDao.insertCategory(category);
}

@Override
public void deleteCategory(long id) {
categoryDao.deleteCategory(id);
}
}
package com.imooc.ibook.dao;

import com.imooc.ibook.entity.Category;
import org.apache.ibatis.annotations.*;

import java.util.List;

public interface CategoryDao {

@Select("SELECT * FROM category")
@Results({
@Result(property = "id",column = "id"),
@Result(property = "name",column = "name"),
@Result(property = "create_time",column = "create_time"),
@Result(property = "update_time",column = "update_time")
})
List<Category> selectAllCategories();

@Insert("INSERT category VALUES(NULL,#{name},NOW(),NOW())")
void insertCategory(Category category);

@Delete("DELETE * FROM category WHERE id=#{id}")
void deleteCategory(long id);
}
package com.imooc.ibook.biz;

import com.imooc.ibook.entity.Category;

import java.util.List;

public interface CategoryBiz {
//获取全部分类
List<Category> getAllCategoried();

//添加分类
void addCategory(Category category);

//根据id删除分类
void deleteCategory(long id);
}
package com.imooc.ibook.global;

import javax.servlet.GenericServlet;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

public class GlobalController extends GenericServlet {
@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
HttpServletRequest request= (HttpServletRequest) servletRequest;
HttpServletResponse response= (HttpServletResponse) servletResponse;
String servletPath=request.getServletPath();
String methodName=null;
String controllerPath="com.imooc.ibook.controller.";
if(servletPath.indexOf("/admin")!=-1){
servletPath=servletPath.substring(7);
}else{
servletPath=servletPath.substring(1);
}
int slashIndex=servletPath.indexOf("/");
if(slashIndex!=-1){
controllerPath=controllerPath+servletPath.substring(0,slashIndex)+"Controller";
methodName=servletPath.substring(slashIndex+1,servletPath.indexOf(".do"));
}else{
controllerPath=controllerPath+"DefaultController";
methodName=servletPath.substring(0,servletPath.indexOf(".do"));
}
try {
Class controllerClass=Class.forName(controllerPath);
Object controllerObject=controllerClass.newInstance();
Method controllerMethod=controllerClass.getMethod(methodName,HttpServletRequest.class,HttpServletResponse.class);
controllerMethod.invoke(controllerObject,request,response);
} catch (ClassNotFoundException | NoSuchMethodException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
} catch (InstantiationException e) {
e.printStackTrace();
}
}
}
package com.imooc.ibook.entity;

public class Category {
private Long id;
private String name;
private String createTime;
private String updateTime;

public Long getId() {
return id;
}

public void setId(Long id) {
this.id = id;
}

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

public String getCreateTime() {
return createTime;
}

public void setCreateTime(String createTime) {
this.createTime = createTime;
}

public String getUpdateTime() {
return updateTime;
}

public void setUpdateTime(String updateTime) {
this.updateTime = updateTime;
}
}


写回答

2回答

好帮手慕阿满

2021-02-05

同学你好,如下需要去掉try中的SqlSessionFactory,三个sessionFactory是同一个对象,try中的sessionFactory是初始化sessionFactory,如果try中重新定义了sessionFactory,那么getDao()方法中的sessionFactory没有初始化,也就是null,使用其调用方法时就会出现空指针异常。

http://img.mukewang.com/climg/601d03de09ef036406350536.jpg

祝学习愉快~

0

好帮手慕阿满

2021-02-05

同学你好,报错提示最终出现DaoFactory类的getDao()方法中,如:

http://img.mukewang.com/climg/601d01fe095ae2c607370106.jpg

建议同学将DaoFactory类的代码也贴一下。

祝学习愉快~

0
honwayshon
hpre class="brush:java;toolbar:false">​package com.imooc.ibook.global;

import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;

import java.io.IOException;


public class DaoFactory {
private static SqlSessionFactory sqlSessionFactory;
private static DaoFactory daoFactory;

private DaoFactory(){
SqlSessionFactoryBuilder sqlSessionFactoryBuilder=new SqlSessionFactoryBuilder();
try {
SqlSessionFactory sqlSessionFactory=sqlSessionFactoryBuilder.build(Resources.getResourceAsReader("/mybatis-config.xml"));
} catch (IOException e) {
e.printStackTrace();
}
}

public static DaoFactory getInstance(){
if(daoFactory==null){
daoFactory=new DaoFactory();
}
return daoFactory;
}

public <T> T getDao(Class<T> daoClass){
SqlSession sqlSession=sqlSessionFactory.openSession(true);
return sqlSession.getMapper(daoClass);
}
}
h021-02-05
共1条回复

0 学习 · 8016 问题

查看课程