Prise en java.lang.NullPointerException dans spring mvc
Je suis en train d'essayer de persister les données de formulaire à la base de données à l'aide de spring MVC, hibernate et mais lors de l'appel de la méthode d'enregistrement de la session hibernate.getSession.enregistrer(s), c'est le retour NullPointerException.
Voici le code de mon 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>
Et voici le web.xml fichier
<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>
Et mon dispatcher-servlet.xml est
<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>
et voici mon modèle Étudiant de classe
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;
}
}
Et mon contrôleur est
@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);
}
Voici mon 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;
}
}
L'Exception, je suis à la d.enregistrer(s) dans 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)
Je suis débutant à spring mvc, merci de m'aider .
je suis arriver Exception lors de l'appel insérer, j'ai utilisé @Autocâblés aussi...
- La ligne est la ligne 36 en
MyController
? - d.enregistrer(s) en classe de contrôleur qui est MyController
- Vous avez SessionFactory de référence nommé comme sessionFactory mais vous êtes à l'aide de sf pour appeler openSession() ?....Avez-vous des deux SessionFactory configuré?...Et aussi où vous avez initialisé Étudiant objet?
Vous devez vous connecter pour publier un commentaire.
À moins que le stacktrace vous avez posté n'est pas exacte, alors la référence null est votre
Dao
dans le contrôleur. Êtes-vous sûr qu'il est en train d'être connectés correctement?La raison pour NullPointerException est: ni l'un, vous êtes à l'aide de @ModelAttribute pour le haricot de liaison, ni que vous avez créé
dans le cas où si vous ne voulez pas @ModelAttribute.
Vous
Il vous manque des @ModelA rrtibute avant que le paramètre Étudiant s dans votre code de contrôleur. Si vous utilisez @ModelAttribute annotation de haricot de liaison, vous n'avez pas besoin d'obtenir les paramètres de la requête de demande et de remplir le haricot. Par conséquent, supprimer les éléments suivants:
L'Annotation @ModelAttribute lie automatiquement les paramètres de la demande pour l'appariement des propriétés du bean sur laquelle il est appliqué.
Edit: vous avez annoté de la classe Dao avec @Repository. Il va créer un objet singleton avec le nom de dao. Si vous souhaitez un autre nom à l'exception de l'utiliser
Maintenant, vous pouvez autowire l'instance d comme vous le faisiez
Dans votre cas, la autocâblés Dao instance est nulle car le printemps est incapable de autowire un bean nommé d. Par conséquent, vous êtes en invoquant la méthode save sur la référence null.
Dao
est nul -- rien à voir avec la référence à l'étudiant.d.save(s)
est leDao
.@Autowired(required = true) private Dao d;
ligne n ° 30 estd.save(s);
@Rahul, vous êtes de liaison de données dans la Méthode Get, mais en fait, vous ne devriez pas le faire dans la méthode GET
lorsque vous traitez avec le formulaire, vous devez toujours Utiliser la méthode POST
je pense qu'il pourrait vous aider 🙂