java - 在Web应用程序中使用Hibernate和Spring的问题

标签 java hibernate spring

我在尝试 getCurrentSession() 时遇到 NullPointerException

 java.lang.NullPointerException
 servlets.ControlServlet.doPost(ControlServlet.java:46)
 javax.servlet.http.HttpServlet.service(HttpServlet.java:709)
 javax.servlet.http.HttpServlet.service(HttpServlet.java:802)

我使用Tomcat 5.5 index.jsp页面:

    <%@ page language="java" contentType="text/html; charset=ISO-8859-1"pageEncoding="ISO-8859-1"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title></title>
</head>
<body>
<%@ page import="java.util.List" %>
<%@ page import="data.Singer" %>
<jsp:useBean id="singer" class="data.Singer" scope="session"/> 
<jsp:setProperty name="singer" property="*" />

<form action="ControlServlet" method="POST">
    <form method=“POST”>
    Name:<br /> 
    <input type=“text” name="name" /><br />
    Type:<br />
    <input type=“text” name="type" /><br />
    <input type="submit" name="Add song" value="Add song">
    <input type="submit" name="save" value="Save" /><br><br>
<input type ="submit" name="values" value="Get values" >
</form>
</body>
</html>

web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app id="WebApp_ID" version="2.4"
    xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
    <display-name>webproject</display-name>

    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>/WEB-INF/beans.xml, /WEB-INF/conf.xml, /WEB-INF/singers.hbm.xml, /WEB-INF/songs.hbm.xml, /WEB-INF/singerbeans.xml, /WEB-INF/songbeans.xml</param-value>
    </context-param>

    <servlet>
        <servlet-name>context</servlet-name>
        <servlet-class>org.springframework.web.context.ContextLoaderServlet</servlet-class>
        <load-on-startup>1</load-on-startup>
    </servlet>

    <servlet>
        <servlet-name>test</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>test</servlet-name>
        <url-pattern>*.*</url-pattern>
    </servlet-mapping>

    <servlet>
        <servlet-name>action</servlet-name>
        <servlet-class>org.apache.struts.action.ActionServlet</servlet-class>
        <init-param>
            <param-name>config</param-name>
            <param-value>/WEB-INF/beans.xml, /WEB-INF/conf.xml, /WEB-INF/singers.hbm.xml, /WEB-INF/songs.hbm.xml, /WEB-INF/singerbeans.xml, /WEB-INF/songbeans.xml</param-value>
        </init-param>
        <init-param>
            <param-name>debug</param-name>
            <param-value>2</param-value>
        </init-param>
        <init-param>
            <param-name>detail</param-name>
            <param-value>2</param-value>
        </init-param>
        <load-on-startup>2</load-on-startup>
    </servlet>
    <servlet>
        <description>
    </description>
        <display-name>ControlServlet</display-name>
        <servlet-name>ControlServlet</servlet-name>
        <servlet-class>servlets.ControlServlet</servlet-class>
    </servlet>

    <servlet-mapping>
        <servlet-name>action</servlet-name>
        <url-pattern>*.*</url-pattern>
    </servlet-mapping>
    <servlet-mapping>
        <servlet-name>ControlServlet</servlet-name>
        <url-pattern>/ControlServlet</url-pattern>
    </servlet-mapping>


</web-app>

ControlServlet.java

public class ControlServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;
    @Autowired
    private SingerDao singerdao; 
    public SingerDao getSingerDao() {
        return singerdao;
    }

    public void setSingerDao(SingerDao singerdao) {
        this.singerdao = singerdao;
    }

    public ControlServlet() {
        super();
        // TODO Auto-generated constructor stub
    }


    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // TODO Auto-generated method stub
    }

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        if (request.getParameter("values") != null) {
            response.getWriter().println(singerdao.getDBValues());
        }
    }

}

和 SingerDao.java

public class SingerDao implements SingerDaoInterface {
    @Autowired
    private SessionFactory sessionFactory;

    public void setSessionFactory(SessionFactory sessionFactory) {
        this.sessionFactory = sessionFactory;
    }

    public List getDBValues() {
        Session session = getCurrentSession();
        List<Singer> singers = session.createCriteria(Singer.class).list();
        return singers;
    }

    private org.hibernate.classic.Session getCurrentSession() {
        return sessionFactory.getCurrentSession();
    }

    public void updateSinger(Singer singer) {
        Session session = getCurrentSession();
        session.update(singer);
    }

    public Singer getSinger(int id) {
        Singer singer = null;
        Session session = getCurrentSession();
        singer = (Singer) session.load(Singer.class, id);
        return singer;

    }

    public void deleteSinger(Singer singer) {
        Session session = getCurrentSession();
        session.delete(singer);
    }

    public void insertRow(Singer singer) {
        Session session = getCurrentSession();
        session.save(singer);
    }



}

在简单的Java项目中它工作得很好。我认为sessionFactory不会 Autowiring ,但为什么呢? 谢谢大家。

最佳答案

您不能使用@Autowired在普通 servlet 中,因为它们不受 Spring 管理。

但是,您可以使用以下技巧来手动启动 servlet 的 Autowiring :

public class ControlServlet extends HttpServlet {
    @Autowired
    private SingerDao singerdao; 

    public void init(ServletConfig cfg) {
        super.init(cfg);
        WebApplicationContextUtils
            .getWebApplicationContext(cfg.getServletContext())
            .getAutowireCapableBeanFactory()
            .autowireBean(this);
    } 
    ...
}

此外,正如评论中所建议的,因为您已经拥有 Spring MVC 的 DispatcherServlet在您的设置中,也许最好实现 ControlServlet 的功能作为 Spring MVC Controller 而不是 servlet(除非您有充分的理由将其作为 servlet)。

关于java - 在Web应用程序中使用Hibernate和Spring的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5079768/

相关文章:

java - 我可以使用注入(inject)的 bean 作为另一个类方法的参数吗?

java - 将文本的第二行与下一页的第一行进行比较

java - Apache Mesos 实际上做了什么?

java - 当在 Spring Boot 应用程序上禁用 open-in-view 时,Eclipse 或 Spring Boot 可以帮助我找到需要事务的方法吗?

java.lang.ClassCastException : java. math.BigDecimal 无法转换为 java.lang.Long

java - Hibernate:对 MySQL 使用反引号,但对 HSQL 不使用

java - 在 Dockerfile 中覆盖继承的 CMD 并不总是有效?

java - ViewPager2 刷卡时闪烁/重新加载

java - 读取和写入 Amazon s3 存储桶中的文件

java - Hibernate数据访问是否会抛出类似于Spring DeadlockLoserDataAccessException或其他TransientDataAccessException的异常?