2013-06-25 3 views
0

스프링 MVC를 사용하여 폼 데이터를 데이터베이스에 유지하려고 시도하고 최대 절전 모드이지만 hibernate session.getSession.save의 save 메서드를 호출 할 때 NullPointerException이 반환됩니다. 여기 스프링 MVC에서 java.lang.NullPointerException 가져 오기

내 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> 

입니다 그리고 여기 내 모델 클래스 학생

123,그리고 내 컨트롤러는

여기
@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); 

} 

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

예외

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) 

나는 초심자 나는 내가 MyController에에 d.save (들)에 얻고 내 다오입니다 봄 mvc 나를 도와주세요. 나는 또한 @Autowired를 사용한 인서트를 호출하는 동안 은 내가

+1

어떤 줄이'MyController'의 36 줄입니까? –

+0

MyController 인 컨트롤러 클래스의 d.save (s) –

+0

@Rahul sessionFactory라는 이름의 SessionFactory 참조가 있지만 openSession()을 호출하는 데 sf를 사용하고 있습니까? .... 두 개의 SessionFactory가 구성되어 있습니까? ... 그리고 또한 어디에서 학생 객체를 초기화 했습니까? –

답변

1

NullPointerException이 이유는 ... 예외를 얻고있다 : 당신이 모두 바인딩 콩에 대한 @ModelAttribute를 사용하고도 당신은

Student s = new Student(); 
을 만들었습니다

의 경우 원하지 않는 경우 @ModelAttribute. 너 컨트롤러 코드에 학생 앞에 @ ModelArrtibute가 누락되었습니다. 입니다. 빈 바인딩에 @ ModelAttribute 어노테이션을 사용하면 요청 매개 변수를 요청에서 가져 와서 채울 필요가 없습니다. 따라서 다음의 제거 :

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

    } 

편집 : 당신이 @Repository와 클래스 다오을 주석했다. 이름이 인 singleton 개체를 만듭니다. dao.당신이 그것을 제외한 다른 이름을 원하는 경우 귀하의 경우에는

@Autowired (required = true) 
private Dao d; 

하고 있었로 봄이기 때문에, 다음 autowire가 다오 인스턴스가 null 이제 인스턴스를 D를 autowire하기 수

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

} 

를 사용 bean d을 autowire 할 수 없습니다. 따라서 널 참조에 대해 save 메소드를 호출 중입니다.

+0

그건 맞지 않아. 스택 트레이스 (stacktrace)는 그의 'Dao'가 null임을 나타냅니다. 학생에 대한 언급과는 아무런 관련이 없습니다. –

+0

스택 추적은 MyController 클래스의 행 번호 36에서 NullPointerException을 나타냅니다. –

+0

오른쪽,'d.save (s) '에서 역 참조되는 유일한 포인터는'Dao'입니다. –

2

게시 한 stacktrace가 정확하지 않으면 null 참조가 컨트롤러에 Dao이됩니다. 확실하게 올바르게 연결되어 있습니까?

+0

업데이트했습니다. 내 stackTrace. 제발 솔루션을 제안 해주세요 .. –

0

@Rahul, 당신은 Get Method에서 데이터를 바인딩하고 있지만 실제로는 POST 메서드 을 사용하여 양식을 처리 할 때 GET 메서드 을 사용하면 안됩니다.

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

    } 
관련 문제