2013-06-25 2 views
0

Я пытаюсь сохранить данные формы в базе данных с использованием Spring MVC и hibernate, но при вызове метода сохранения hibernate session.getSession.save (s) он возвращает NullPointerException.Получение java.lang.NullPointerException весной mvc

Вот код моего index.jsp

<html> 
<head> 
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> 
    <title>Welcome to Spring Web MVC project</title> 
</head> 

<body> 
    <form action="insert.htm"> 
     <label> Name:</label><input type="text" name="name"><br> 
     <label> Id:</label><input type="text" name="id"><br> 
     <input type="submit" value="Enter"> 
    </form> 
</body> 
</html> 

А вот файл web.xml

<servlet> 
    <servlet-name>dispatcher</servlet-name> 
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> 
    <load-on-startup>2</load-on-startup> 
</servlet> 
<servlet-mapping> 
    <servlet-name>dispatcher</servlet-name> 
    <url-pattern>*.htm</url-pattern> 
</servlet-mapping> 
<session-config> 
    <session-timeout> 
     30 
    </session-timeout> 
</session-config> 
<welcome-file-list> 
    <welcome-file>index.jsp</welcome-file> 
</welcome-file-list> 
</web-app> 

И мой диспетчеру-servlet.xml является

<bean class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean" id="sessionFactory"> 
<property name="dataSource" ref="dataSource" /> 
<property name="annotatedClasses"> 
    <list> 
     <value>com.model.Student</value> 
    </list> 
</property> 
<property name="hibernateProperties"> 
<props> 
     <prop key="hibernate.dialect">org.hibernate.dialect.Oracle10gDialect</prop> 
     <prop key="hibernate.hbm2ddl.auto">update</prop> 
</props> 
</property> 
</bean> 
<bean id="dataSource" 
    class="org.apache.commons.dbcp.BasicDataSource" 
    p:driverClassName="oracle.jdbc.driver.OracleDriver" 
    p:url="jdbc:oracle:thin:@localhost:1521:Xe" 
    p:username="hibernate" 
    p:password="hibernate"></bean> 
    <bean id="hibernatetransactionManager"    class="org.springframework.orm.hibernate3.HibernateTransactionManager"> 
    <property name="sessionFactory" ref="sessionFactory"></property>     
    </bean> 

и вот мой модельный класс Студент

package com.model; 

import javax.persistence.Id; 
import javax.persistence.Entity; 


@Entity 
    public class Student { 
    @Id  
    private int id; 
    private String name; 

    public int getId() { 
    return id; 
} 

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

public String getName() { 
    return name; 
} 

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

    } 

И мой контроллер

@Controller 
public class MyController { 

@Autowired 
    private Dao d; 
@RequestMapping(value="/insert.htm",method = RequestMethod.GET) 
public ModelAndView insert(HttpServletRequest req,Student s) 
{ 
    String name=req.getParameter("name"); 
    int id=Integer.parseInt(req.getParameter("id")); 
    s.setId(id); 
    s.setName(name); 
    System.out.println(s.getName()); 
    d.save(s); 
    return new ModelAndView("display","Student",s); 

} 

Вот мой Dao

@Repository 
public class Dao { 
@Autowired 
private SessionFactory sessionFactory; 

public int save(Student s) 
    { 

    /*Session s1=sf.openSession(); 
    s1.beginTransaction(); 
    int i=(Integer)s1.save(s); 
    s1.getTransaction().commit(); 
    return i;*/ 
    int i=(Integer)sessionFactory.getCurrentSession().save(s); 
    return i; 
    } 
    } 

Исключение я клоню d.save (ов) в MyController

SEVERE: Servlet.service() for servlet [dispatcher] in context with path [/Spring5]   
threw exception [Request processing failed; nested exception 
at com.controller.MyController.insert(MyController.java:30) 
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) 
at s un.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
at java.lang.reflect.Method.invoke(Method.java:601) 
at org.springframework.web.bind.annotation.support.HandlerMethodInvoker.invokeHandlerMethod(Ha ndlerMethodInvoker.java:176) 
    at org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.invokeHandlerMethod(AnnotationMethodHandlerAdapter.java:436) 
    at org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.handle(AnnotationMethodHandlerAdapter.java:424) 
    at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:923) 
at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:852) 
    at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:882) 
    at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:778) 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:621) 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:728) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210) 
    at org.netbeans.modules.web.monitor.server.MonitorFilter.doFilter(MonitorFilter.java:393) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.jav a:243) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210) 
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:222) 
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:123) 
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472) 
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:171) 
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:99) 
    at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:936) 
    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:1004) 
    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:589) 
    at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:312) 
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) 
    at java.lang.Thread.run(Thread.java:722) 

Я новичок чтобы весной mvc, пожалуйста, помогите мне. я получаю исключение при вызове вставки я использовал @Autowired также ...

+1

Какая строка находится в строке 36 в 'MyController'? –

+0

d.save (s) в классе контроллера, который является MyController –

+0

@Rahul У вас есть ссылка SessionFactory, называемая sessionFactory, но вы используете sf для вызова openSession()? .... У вас есть два настроенных SessionFactory? ... И также где вы инициализировали объект Student? –

ответ

1

Причина NullPointerException является: ни вы используете @ModelAttribute для боба связывания, ни вы создали

Student s = new Student(); 

в случае если не хотите @ModelAttribute. Вы Вам не хватает @ModelA rrtibute перед параметром Студент s в вашем коде контроллера. Если вы используете @ModelAttribute аннотация для привязки bean, вам не нужно получать параметры запроса из запроса и заполнять компонент. Поэтому удалить следующее:

String name=req.getParameter("name"); 
int id=Integer.parseInt(req.getParameter("id")); 
s.setId(id); /* Here you are setting a value with a reference wcich points to null */ 
s.setName(name); /* Here you are setting a value with a reference wcich points to null */ 

аннотацию @ModelAttribute автоматически связывает параметры запроса к согласующим свойствам компоненты, на которую он нанесен.

@Controller 
public class MyController { 

    @Autowired(required = true) 
    private Dao d; 
    @RequestMapping(value="/insert.htm",method = RequestMethod.GET) 
    public ModelAndView insert(HttpServletRequest req,@ModelAttribute Student s) 
    { 
     System.out.println(s.getName()); 
     d.save(s); 
     return new ModelAndView("display","Student",s); 

    } 

Edit: вы аннотированный класс Dao с @Repository. Он создаст одноэлементный объект с именем dao.Если вы хотите какое-либо другое имя, кроме него, а затем использовать

@Repository(value ="d") 
public class Dao{ 

} 

Теперь вы можете autowire экземпляра д, как вы делали

@Autowired (required = true) 
private Dao d; 

В вашем случае autowired экземпляр Dao является недействительным, потому что весна не удалось автоуведовать фасоль с именем d. Поэтому вы вызываете метод save на null reference.

+0

Это не кажется правильным. Столбец указывает, что его «Дао» является нулевым - не имеет ничего общего со ссылкой на ученика. –

+0

Трассировка стека указывает на исключение NullPointerException в строке № 36 в классе MyController. –

+0

Правильно, и единственным указателем, который разыменован в 'd.save (s)', является 'Dao'. –

2

Если вы не разместили стопку, то нулевая ссылка - это ваш Dao в контроллере. Вы уверены, что он правильно подключен?

+0

Я обновил мой stackTrace. Пожалуйста, предложите мне решение .. –

0

@Rahul, вы связывания данных в Получ, но на самом деле вы не должны делать это в методе GET , когда вы имеете дело с формой, вы должны всегда метод использования POST я думаю, что это может помочь вам :-)

@RequestMapping(value="/insert.htm",method = RequestMethod.POST) 
    public ModelAndView insert(HttpServletRequest req,@ModelAttribute Student s) 
    { 
     System.out.println(s.getName()); 
     d.save(s); 
     return new ModelAndView("display","Student",s); 

    }