java.lang.NullPointerException when I try to access a page mapped to a Controller

58,685

Solution 1

Instead of

@Repository
public class UserDaoImpl implements UserDao{

use

@Repository("userDao")
public class UserDaoImpl implements UserDao{

By Defualt UserDaoImpl will have name userDaoImpl so its not autowiring.

And annotate UserServiceImpl with the @Service

Or add UserServiceImpl in Spring XML

Also if your using Spring Annotations you need not use same bean declarations in XML

Also just noticed you are not importing stbam-data.xml inside stbam-servlet.xml so If i am not wrong the file is not being used...

Try below in your stbam-servlet.xml

<import resource="classpath:stbam-data.xml" />

As per added web.xml file (you are missing COMMA ) Try with it.

<context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>
            /WEB-INF/stbam-service.xml,
            /WEB-INF/stbam-data.xml,
            /WEB-INF/stbam-security.xml
        </param-value>

</context-param>

Solution 2

Annotate your UserServiceImpl with the @Service stereotype so that it becomes eligible for autowiring.

Share:
58,685
Admin
Author by

Admin

Updated on August 01, 2022

Comments

  • Admin
    Admin almost 2 years

    I'm coding an application in spring 3 and hibernate, when I try to access a "users" jsp page mapped to the "UserController" controller I get an exception:

    SEVERE: Servlet.service() for servlet [stbam] in context with path [/STBAM] threw exception [Request processing failed; nested exception is java.lang.NullPointerException] with root cause
    java.lang.NullPointerException
        at com.gsimt.stbam.service.UserServiceImpl.listAllUsers(UserServiceImpl.java:16)
        at com.gsimt.stbam.controller.UserController.listUsers(UserController.java:24)
        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:176)
        at org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.invokeHandlerMethod(AnnotationMethodHandlerAdapter.java:440)
        at org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.handle(AnnotationMethodHandlerAdapter.java:428)
        at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:925)
        at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:856)
        at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:936)
        at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:827)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:621)
        at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:812)
        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:123)
        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:1001)
        at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:579)
        at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:312)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
        at java.lang.Thread.run(Unknown Source)
    

    Here the code of my UserController.java:

    package com.gsimt.stbam.controller;
    
    import java.util.List;
    import java.util.Map;
    
    import org.springframework.stereotype.Controller;
    import com.gsimt.stbam.domain.User;
    import com.gsimt.stbam.service.UserService;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RequestMethod;
    import org.springframework.web.servlet.ModelAndView;
    
    @Controller
    public class UserController {
    
        @Autowired
        private UserService userService;
    
         @RequestMapping("/users")
            public String listUsers(Map<String, Object> map) {
    
                map.put("user", new User());
                map.put("userList", userService.listAllUsers());
    
                return "users";
            }
    }
    

    UserService.java:

    package com.gsimt.stbam.service;
    
    import java.util.List;
    
    import com.gsimt.stbam.domain.User;
    import com.gsimt.stbam.dao.UserDao;
    import org.springframework.beans.factory.annotation.Autowired;
    
    public class UserServiceImpl implements UserService {
    
        @Autowired
        private UserDao userDao;
    
        public List<User> listAllUsers() {
            // TODO Auto-generated method stub
            return userDao.listUsers();
        }
    
        public User getUserById(Integer Id) {
            // TODO Auto-generated method stub
            return userDao.getUserById(Id);
        }
    
        public void addUser(User user) {
            // TODO Auto-generated method stub
            userDao.addOrUpdateUser(user);
        }
    
        public void deleteUser(Integer Id) {
            // TODO Auto-generated method stub
            userDao.deleteUser(Id);
        }
    
    }
    

    UserDao.java:

    package com.gsimt.stbam.dao;
    
    import java.util.List;
    
    import com.gsimt.stbam.domain.User;
    
    import org.hibernate.SessionFactory;
    import org.springframework.stereotype.Repository;
    import org.springframework.beans.factory.annotation.Autowired;
    
    @Repository
    public class UserDaoImpl implements UserDao{
    
        @Autowired
        private SessionFactory sessionFactory;
    
        public List<User> listUsers() {
            // TODO Auto-generated method stub
            return (List<User>)sessionFactory.getCurrentSession().createQuery("from User").list();
        }
    
        public User getUserById(Integer Id) {
            // TODO Auto-generated method stub
            User user = (User) sessionFactory.getCurrentSession().load(User.class, Id);
            return user;
        }
    
        public void addOrUpdateUser(User user) {
            // TODO Auto-generated method stub
            sessionFactory.getCurrentSession().saveOrUpdate(user);
        }
    
        public void deleteUser(Integer Id) {
            // TODO Auto-generated method stub
            User user = (User) sessionFactory.getCurrentSession().load(User.class, Id);
            if(user != null){
    
                sessionFactory.getCurrentSession().delete(user);
            }
        }
    
    }
    

    User.java

    package com.gsimt.stbam.domain;
    
    import java.io.Serializable;
    
    import javax.persistence.Entity;
    import javax.persistence.GeneratedValue;
    import javax.persistence.GenerationType;
    import javax.persistence.Table;
    import javax.persistence.Id;
    import javax.persistence.Column;
    
    @Entity
    @Table (name = "USER")
    public class User implements Serializable{
    
        /**
         * 
         */
        private static final long serialVersionUID = 1L;
    
        @Id
        @Column (name = "ID")
        @GeneratedValue(strategy=GenerationType.AUTO)
        private Integer Id;
    
        @Column (name = "LOGIN")
        private String login;
    
        @Column (name = "FIRSTNAME")
        private String firstName;
    
        @Column (name = "LASTNAME")
        private String lastName;
    
        @Column (name = "EMAIL")
        private String email;
    
        @Column (name = "HASH")
        private String hash;
    
        public Integer getId() {
            return Id;
        }
    
        public void setId(Integer id) {
            Id = id;
        }
    
        public String getLogin() {
            return login;
        }
    
        public void setLogin(String login) {
            this.login = login;
        }
    
        public String getFirstName() {
            return firstName;
        }
    
        public void setFirstName(String firstName) {
            this.firstName = firstName;
        }
    
        public String getLastName() {
            return lastName;
        }
    
        public void setLastName(String lastName) {
            this.lastName = lastName;
        }
    
        public String getEmail() {
            return email;
        }
    
        public void setEmail(String email) {
            this.email = email;
        }
    
        public String getHash() {
            return hash;
        }
    
        public void setHash(String hash) {
            this.hash = hash;
        }
    
    
    }
    

    And my disparcher context stbam-servlet.xml:

    <?xml  version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xmlns:aop="http://www.springframework.org/schema/aop"
        xmlns:context="http://www.springframework.org/schema/context"
        xmlns:jee="http://www.springframework.org/schema/jee"
        xmlns:lang="http://www.springframework.org/schema/lang"
        xmlns:p="http://www.springframework.org/schema/p"
        xmlns:tx="http://www.springframework.org/schema/tx"
        xmlns:util="http://www.springframework.org/schema/util"
        xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
            http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd
            http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
            http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee.xsd
            http://www.springframework.org/schema/lang http://www.springframework.org/schema/lang/spring-lang.xsd
            http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd
            http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util.xsd">
    
        <context:annotation-config />
        <context:component-scan base-package="com.gsimt.stbam" />
    
        <bean id="jspViewResolver"
            class="org.springframework.web.servlet.view.InternalResourceViewResolver">
            <property name="viewClass"
                value="org.springframework.web.servlet.view.JstlView" />
            <property name="prefix" value="/WEB-INF/views/" />
            <property name="suffix" value=".jsp" />
        </bean>
    
        <bean id="messageSource"
            class="org.springframework.context.support.ReloadableResourceBundleMessageSource">
            <property name="basename" value="classpath:messages" />
            <property name="defaultEncoding" value="UTF-8" />
        </bean>
        <bean id="propertyConfigurer"
            class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"
            p:location="/WEB-INF/configuration.properties" />
    
    
    
        <tx:annotation-driven />
    
    </beans>
    

    And finally the stbam-data.xml where I'm configuring datasource and sessionfactory:

    <?xml  version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xmlns:aop="http://www.springframework.org/schema/aop"
        xmlns:context="http://www.springframework.org/schema/context"
        xmlns:jee="http://www.springframework.org/schema/jee"
        xmlns:lang="http://www.springframework.org/schema/lang"
        xmlns:p="http://www.springframework.org/schema/p"
        xmlns:tx="http://www.springframework.org/schema/tx"
        xmlns:util="http://www.springframework.org/schema/util"
        xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
            http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd
            http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
            http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee.xsd
            http://www.springframework.org/schema/lang http://www.springframework.org/schema/lang/spring-lang.xsd
            http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd
            http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util.xsd">
    
    
      <bean id="dataSource"
            class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"
            p:driverClassName="com.mysql.jdbc.Driver"
            p:url="jdbc:mysql://localhost:3306/STBAMDB" p:username="root"
            p:password="123456" />
    
    
        <!-- to use hibernate 4, we have to use at least spring 3.2.2 The AnnotationSessionFactoryBean
    
        is not supported anymore and replaced by LocalSessionFactoryBean-->
        <bean id="sessionFactory"
              class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
                <property name="dataSource" ref="dataSource"></property>
                <property name="packagesToScan" value="com.gsimt.stbam.domain"></property>
                <property name="hibernateProperties">
                     <value>
                        hibernate.dialect=org.hibernate.dialect.MySQL5InnoDBDialect
                        hibernate.hbm2ddl.auto=update
                        hibernate.show_sql=true
                    </value>
               </property>    
       </bean>
    
       <bean id="userDao"
             class="com.gsimt.stbam.dao.UserDaoImpl" />
    
    
    
    <bean id="transactionManager" 
      class="org.springframework.orm.hibernate4.HibernateTransactionManager">
        <property name="sessionFactory" ref="sessionFactory"></property>
    </bean>
    
      </beans>
    

    My web.xml:

    <web-app version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
    
        <context-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>
                /WEB-INF/stbam-service.xml
                /WEB-INF/stbam-data.xml
                /WEB-INF/stbam-security.xml
            </param-value>
        </context-param>
    
        <listener>
            <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
        </listener>
    
        <listener>
            <listener-class>org.springframework.web.util.Log4jConfigListener</listener-class>
        </listener>
    
        <servlet>
            <servlet-name>stbam</servlet-name>
            <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
            <init-param>
                <param-name>detectAllViewResolvers</param-name>
                <param-value>true</param-value>
            </init-param>
            <load-on-startup>1</load-on-startup>
        </servlet>
    
        <servlet-mapping>
            <servlet-name>stbam</servlet-name>
            <url-pattern>/</url-pattern>
        </servlet-mapping>
    
    </web-app>
    

    I'v write a unit test to test the UserDao and UserService, and seems to be worhing fine,

    Thanks in advance.


    Just to clear things out, I'm using 3 spring configuration files:

    stbam-data.xml for persistence.

    stbam-service.xml for declaring services beans (including userServiceImpl).

    The problem still here even when I add @Service and @Repositort("userDao")

  • rahul maindargi
    rahul maindargi almost 11 years
    as per OPs stackTrace exception coming at com.gsimt.stbam.service.UserServiceImpl.listAllUsers(UserSer‌​viceImpl.java:16) that means code reaching till 'UserServiceImpl'
  • Admin
    Admin almost 11 years
    Yes you are right, but I'v used a unit test and the function seems working
  • nightfury
    nightfury about 5 years
    I tried doing this but not working for me ? any other work around - I am getting fed up of this error - my elaborated question is here -stackoverflow.com/questions/55196698/… - please check if you have any fix, Thanks