春天mvc与休眠

时间:2015-01-15 12:45:47

标签: java spring hibernate spring-mvc

我是spring mvc的初学者,我想创建一个简单的例子,但我得到异常我的服务层这里是异常

SEVERE: Servlet.service() for servlet [dispatcher] in context with path [/haybet] threw exception      `enter code here`[Request processing failed; nested exception is java.lang.NullPointerException] with root cause
java.lang.NullPointerException
at org.proffart.bet.controller.BetController.registerUser(BetController.java:47)
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 org.springframework.web.bind.annotation.support.HandlerMethodInvoker.invokeHandlerMethod(HandlerMethodInvoker.java:177)
at org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.invokeHandlerMethod(AnnotationMethodHandlerAdapter.java:446)
at org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.handle(AnnotationMethodHandlerAdapter.java:434)
at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:943)
at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:877)
at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:966)
at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:868)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:641)
at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:842)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:722)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:225)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:169)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:168)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:98)
at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:927)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:407)
at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:999)
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:565)
at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:307)
at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
at java.lang.Thread.run(Unknown Source)

我在点击register.jsp中的注册按钮时遇到异常,我猜这个问题是关于hibernate和mysql的连接,请帮我找到问题。

这是我的文件

控制器

package org.proffart.bet.controller;
import java.io.IOException;

import javax.validation.Valid;


import org.proffart.bet.domain.User;
import org.proffart.bet.service.UserService;
import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.servlet.ModelAndView;

@Controller
public class BetController {
UserService service;
//private static final Logger log = Logger.getLogger(BetController.class);

@RequestMapping(value="register", method = RequestMethod.GET)
public String showRegisterForm(ModelMap model){
    User user = new User();
    model.addAttribute("user",user );
    return "register";
}

@RequestMapping(value="/register", method = RequestMethod.POST)
public String registerUser(@Valid User user, BindingResult result,
        ModelMap model){
    System.out.println(user.getNickName());
    System.out.println(user.getNickName());
    System.out.println(user);
    user.setBalance((double) 1);
    user.setEmail("aaa");
    user.setId(1);

    if (result.hasErrors()){
        return "register"; 
    }

    service.saveUser(user);
    return "success";

   }
}

DAO课程

package org.proffart.bet.dao;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.springframework.beans.factory.annotation.Autowired;

public class AbstractDAO {
     @Autowired
     private SessionFactory sessionFactory;

     protected Session getSession(){
        return sessionFactory.getCurrentSession();
     }

     public void persist(Object entity) {
         getSession().persist(entity);
     }
}

UserDao类

package org.proffart.bet.dao;

import java.util.List;

import org.proffart.bet.domain.User;

public interface UserDAO {
    public void addUser(User user);
    public void deleteUser(Integer id);
    public List<User> getUsers();
}

在UserDAOImpl

package org.proffart.bet.dao;

import java.util.List;
import org.hibernate.SessionFactory;
import org.proffart.bet.domain.User;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;

@Repository 
public class UserDAOImpl extends AbstractDAO implements UserDAO{

   @Autowired
   private SessionFactory sessionFactory;   
   public void addUser(User user) {
       persist(user);       
   }

  public void deleteUser(Integer id) {

  }

  public List<User> getUsers() {

  }

}

服务类 UserService

package org.proffart.bet.service;

import javax.transaction.Transactional;

import org.proffart.bet.dao.UserDAO;
import org.proffart.bet.dao.UserDAOImpl;
import org.proffart.bet.domain.User;

@Transactional
public class UserService {
     UserDAO dao;

     public void saveUser(User user){
        dao.addUser(user);
    }
}

Doamin层 用户

package org.proffart.bet.domain;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.Table;

@Entity
@Table(name="users")
public class User {

@Id
@Column(name="id")
@GeneratedValue
private Integer id;

@Column(name="nic_name")
private String nickName;

@Column(name="email")
private String email;

@Column(name="password")
private String password;

@Column(name="balance")
private Double balance;

public String getEmail(){
    return email;
}

public void setEmail(String email){
    this.email = email;
}

public String getNickName(){
    return nickName;
}

public void setNickName(String nickName){
    this.nickName = nickName;
}

public String getPassword(){
    return password;
}

public void setPassword(String password){
    this.password = password;
}

public Double getBalance(){
    return balance;
}

public void setBalance(Double balance){
    this.balance = balance;
}

public Integer getId(){
    return id;
}

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

Reguister.jsp

<%@ page session="true" %>
<%@taglib uri="http://www.springframework.org/tags" prefix="spring" %>
<%@taglib uri="http://www.springframework.org/tags/form" prefix="form" %>
<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@ page isELIgnored="false" %>

<html>
<head>
</head>
<body>
    <h3>Welcome To Virtual bettings</h3>
    <form:form method="POST"  modelAttribute="user">
         <table>
            <tr>
                <td><label for="nickName">Login: </label> </td>
                <td><form:input path="nickName" id="nickName"/></td>
            </tr>
            <tr>
                <td><label for="password">Password: </label> </td>
                <td><form:input path="password" id="password"/></td>
            </tr>                
            <tr>
                <td><input type="submit" value="register"/></td>
            </tr>
        </table>
    </form:form>
</body>
</html>

最后在xml中配置文件 的web.xml

<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/dtd/web-app_2_3.dtd" >
<web-app>
  <display-name>Archetype Created Web Application</display-name>
  <context-param>
 <param-name>contextConfigLocation</param-name>
 <param-value>/WEB-INF/dispatcher-servlet.xml /WEB-INF/hibernateDataAccessContext.xml</param-    value>
 </context-param>
 <servlet>
    <servlet-name>dispatcher</servlet-name>
    <servlet-class>
        org.springframework.web.servlet.DispatcherServlet
    </servlet-class>
    <load-on-startup>1</load-on-startup>
</servlet>

<servlet-mapping>
    <servlet-name>dispatcher</servlet-name>
    <url-pattern>/</url-pattern>
</servlet-mapping>      

hibernateDataAccessContext.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans>
<!-- Auto-detect DAOs -->
<context:component-scan base-package="org.proffart.bet.dao"/>
<context:property-placeholder location="WEB-INF/jdbc.properties"/>

<bean id="dataSource"
class="org.apache.commons.dbcp.BasicDataSource"
destroy-method="close"
p:driverClassName="${jdbc.driverClassName}"
p:url="${jdbc.url}"
p:username="${jdbc.username}"
p:password="${jdbc.password}"
p:maxActive="${dbcp.maxActive}"
p:maxIdle="${dbcp.maxIdle}"
p:maxWait="${dbcp.maxWait}"/>


<bean id="sessionFactory"
class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean"
p:dataSource-ref="dataSource"
p:configurationClass="org.hibernate.cfg.AnnotationConfiguration"
p:packagesToScan="org.proffart.bet.domain">
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">${hibernate.dialect}</prop>
<prop key="hibernate.show_sql">${hibernate.show_sql}</prop>
<prop key="hibernate.format_sql">${hibernate.format_sql}</prop>
<prop key="hibernate.generate_statistics">${hibernate.generate_statistics}</prop>
</props>
</property>
<property name="eventListeners">
<map>
<entry key="merge">
<bean class="org.springframework.orm.hibernate3.support.IdTransferringMergeEventListener"/>
</entry>
</map>
</property>

</bean>


<!-- Allow declarative transaction management using the @Transactional annotation -->
<tx:annotation-driven transaction-manager="txnManager"/>

<!-- Transaction manager for the Hibernate SessionFactory -->
<bean id="txnManager"
class="org.springframework.orm.hibernate3.HibernateTransactionManager"
p:sessionFactory-ref="sessionFactory"/>

<!-- Apply persistence exception translation on @Repository classes -->
<bean class="org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor"/>

</beans>

和dispatcher-servlet.xml

<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.0.xsd">

<context:component-scan base-package="org.proffart.bet.controller" />

<bean
    class="org.springframework.web.servlet.view.InternalResourceViewResolver">
    <property name="prefix">
        <value>/WEB-INF/views/</value>
    </property>
    <property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/>
    <property name="suffix">
        <value>.jsp</value>
    </property>

</bean>

jdbc.properties

hibernate.generate_statistics=true
hibernate.show_sql=true
jpa.showSql=true

hibernate.dialect=org.hibernate.dialect.HSQLDialect

jpa.databasePlatform=org.springframework.samples.petclinic.toplink.EssentialsHSQLPlatformWithNativeSequence

jpa.database=HSQL

jdbc.driverClassName=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/bet
jdbc.username=root
jdbc.password=

4 个答案:

答案 0 :(得分:0)

您的异常在BetController的第47行显示NullPointerException。但是,在您发布的课程中,此行没有任何内容。我的猜测是你的UserService没有注入你的控制器。添加@Autowired注释:

@Controller
public class BetController {
   @Autowired
   UserService service;

答案 1 :(得分:0)

@Service课程上添加UserService注释,在@Autowired课程的下一行添加BetController

@Autowired
UserService service;

我看到你只将组件扫描设置为控制器包,你需要将它设置为下面。

<context:component-scan base-package="org.proffart.bet.*"/>

答案 2 :(得分:0)

我想你错过了将用户服务对象自动装入控制器层 请添加@autowire顶部的Userservice对象它将解决您的问题。

@Autowire UserService服务;

如果它提出任何问题只是谷歌如何自动装配服务对象,

您在创建服务对象时也犯了一个错误,您需要创建用户服务作为接口和一个用户服务的Concert实现,如UserServiceImpl

谢谢, 人士Himanshu

答案 3 :(得分:0)

这是使用JQuery Ajax进行Spring mvc crud操作的最佳示例。你也可以在这里找到maven。

网站:Spring MVC With Hibernate CRUD

或者您可以访问YouTube频道:Spring MVC with Hibernate CRUD VIDEO