【问题标题】:Spring mvc with hibernate带有休眠的Spring mvc
【发布时间】:2015-03-13 20:49:38
【问题描述】:

我是 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();
}

用户DAOImpl

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() {

  }

}

服务类 用户服务

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);
    }
}

领域层 用户

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;
 }
}

Register.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=

【问题讨论】:

  • @Autowired 放在控制器的UserService 字段中。

标签: java spring hibernate spring-mvc


【解决方案1】:

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

@Controller
public class BetController {
   @Autowired
   UserService service;

【讨论】:

  • 谢谢,但我得到了 org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [org.hibernate.SessionFactory] ​​found for dependency: expected at least 1 bean that qualifying as autowire Candidate对于这种依赖。依赖注释:{@org.springframework.beans.factory.annotation.Autowired(required=true)} 提及更改后
【解决方案2】:

我认为您错过了将 Userservice 对象自动连接到控制器层 请在 Userservice 对象的顶部添加 @autowire 它将解决您的问题。

@Autowire 用户服务服务;

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

另外,您在创建服务对象时犯了一个错误,您需要创建 Userservice 作为接口和 UserService 的一个一致实现,如 UserServiceImpl

谢谢, 喜满洲

【讨论】:

    【解决方案3】:

    @Service 注释放在UserService 类上,并将@Autowired 放在BetController 类的下一行。

    @Autowired
    UserService service;
    

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

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

    【讨论】:

    • 谢谢,但我得到了 org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [org.hibernate.SessionFactory] ​​found for dependency: expected at least 1 bean that qualifying as autowire Candidate对于这种依赖。依赖注释:{@org.springframework.beans.factory.annotation.Autowired(required=true)} 提及更改后
    【解决方案4】:

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

    网站:Spring MVC With Hibernate CRUD

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

    【讨论】:

      猜你喜欢
      • 2016-01-26
      • 1970-01-01
      • 1970-01-01
      • 2014-02-02
      • 1970-01-01
      • 1970-01-01
      • 2012-01-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多