-5

I am trring to create an application where I am getting a problem. Here is the code

HomeController.java

@Controller
public class HomeController {

    private EmployeeService employeeService;

    @Autowired(required=true)
    @Qualifier(value="employeeService")
    public void setEmployeeService(EmployeeService employeeService)
    {
        this.employeeService = employeeService;
    }

    @RequestMapping("/index")
    public ModelAndView indexWorld(@ModelAttribute("loginForm") Employee employee, ModelMap model) {

        return new ModelAndView("index", "welcomeMessage","Hello Guest! welcome to our site");
    }

    @RequestMapping("/login")
    public ModelAndView loginWorld(@ModelAttribute("loginForm") Employee employee, ModelMap model){

        String result="", returnPage="";
        if(this.employeeService.validateLogin(employee.getUsername(), employee.getPassword())){
            result = "Welcome " + employee.getUsername();
            returnPage = "home";
        }
        else{
            result = "<BR>Login Failure";
            returnPage = "index";
        }
        model.addAttribute("result", result);
        return new ModelAndView(returnPage, model);
    }
}

EmployeeServiceImpl.java

@Service
public class EmployeeServiceImpl implements EmployeeService {

    /* (non-Javadoc)
     * @see com.smart.service.EmployeeService#validateLogin(java.lang.String, java.lang.String)
     */

    EmployeeDAO employeeDAO;

    public void setEmployeeDAO(EmployeeDAO employeeDAO)
    {
        this.employeeDAO = employeeDAO;
    }

    @Override
    public boolean validateLogin(String username, String password) {
        // TODO Auto-generated method stub
        return this.employeeDAO.validateLogin(username, password);

    }    
}

EmployeeDAOImpl.java

@Transactional(value="myTransactionManager")
public class EmployeeDaoImpl implements EmployeeDAO {

    private SessionFactory sessionFactory;

    public void setSessionFactory(SessionFactory sessionFactory)
    {
        this.sessionFactory = sessionFactory;
    }
    @Override
    public boolean validateLogin(String username, String password) {

        return (long)this.sessionFactory.getCurrentSession().createQuery("SELECT COUNT(*) FROM EmployeeInfo WHERE username = :username AND password = :password")
        .setString("username", username)
        .setString("password", password).uniqueResult() > 0;

    }    
}

welcome-servlet.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:context="http://www.springframework.org/schema/context"
    xmlns:p="http://www.springframework.org/schema/p"
    xmlns:tx="http://www.springframework.org/schema/tx"
    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.xsd
        http://www.springframework.org/schema/context 
        http://www.springframework.org/schema/context/spring-context.xsd
        http://www.springframework.org/schema/tx
        http://www.springframework.org/schema/tx/spring-tx.xsd
        http://www.springframework.org/schema/mvc
        http://www.springframework.org/schema/mvc/spring-mvc.xsd"
    xmlns:mvc="http://www.springframework.org/schema/mvc">

    <context:annotation-config />
    <context:component-scan base-package="com.smart" />
    <mvc:annotation-driven />
    <tx:annotation-driven transaction-manager="myTransactionManager" />

    <bean id="employeeService" class="com.smart.service.EmployeeServiceImpl"></bean>
    <bean id="employeeDAO" class="com.smart.dao.EmployeeDaoImpl"></bean>

    <bean id="transactionManager" class="org.springframework.orm.hibernate4.HibernateTransactionManager">
        <property name="sessionFactory" ref="sessionFactory" />
    </bean>

    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix" value="/view/" />
        <property name="suffix" value=".jsp" />
    </bean>

<bean id="sessionFactory"
        class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
        <property name="dataSource" ref="dataSource" />
        <property name="configLocation">
            <value>classpath:hibernate.cfg.xml</value>
        </property>
        <property name="hibernateProperties">
            <props>
                <prop key="hibernate.dialect">${jdbc.dialect}</prop>
                <prop key="hibernate.show_sql">true</prop>
            </props>
        </property>
    </bean>

    <bean id="dataSource"
    class="org.springframework.jdbc.datasource.DriverManagerDataSource"
    p:driverClassName="oracle.jdbc.OracleDriver"
    p:url="jdbc:oracle:thin:@localhost:1521:IMS"
    p:username="username"
    p:password="password" />

    <mvc:resources mapping="/resources/**" location="/resources/theme1/" />
</beans>

Error

org.springframework.web.util.NestedServletException: Request processing failed; nested exception is java.lang.NullPointerException
    org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:979)
    org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:869)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:647)
    org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:843)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:728)

root cause

java.lang.NullPointerException
    com.smart.service.EmployeeServiceImpl.validateLogin(EmployeeServiceImpl.java:32)
    com.smart.controller.HomeController.loginWorld(HomeController.java:38)
    sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    java.lang.reflect.Method.invoke(Method.java:606)
    org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:221)
    org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:137)
    org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:110)
    org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandleMethod(RequestMappingHandlerAdapter.java:776)
    org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:705)
    org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:85)
    org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:959)
    org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:893)
    org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:967)
    org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:869)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:647)
    org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:843)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:728)

I am getting in EmployeeServiceImpl.java on this line

return this.employeeDAO.validateLogin(username, password);

It seems I am getting null from validateLogin function although I am return value from validateLogin function. Why I am getting null?

EDIT

Now error

org.springframework.web.util.NestedServletException: Request processing failed; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named 'myTransactionManager' is defined: No matching PlatformTransactionManager bean found for qualifier 'myTransactionManager' - neither qualifier match nor bean name match!
    org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:979)
    org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:869)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:647)
    org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:843)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:728)

root cause

org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named 'myTransactionManager' is defined: No matching PlatformTransactionManager bean found for qualifier 'myTransactionManager' - neither qualifier match nor bean name match!
    org.springframework.beans.factory.annotation.BeanFactoryAnnotationUtils.qualifiedBeanOfType(BeanFactoryAnnotationUtils.java:100)
    org.springframework.beans.factory.annotation.BeanFactoryAnnotationUtils.qualifiedBeanOfType(BeanFactoryAnnotationUtils.java:56)
    org.springframework.transaction.interceptor.TransactionAspectSupport.determineQualifiedTransactionManager(TransactionAspectSupport.java:377)
    org.springframework.transaction.interceptor.TransactionAspectSupport.determineTransactionManager(TransactionAspectSupport.java:358)
    org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:271)
    org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:96)
    org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
    org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:207)
    com.sun.proxy.$Proxy37.validateLogin(Unknown Source)
    com.smart.service.EmployeeServiceImpl.validateLogin(EmployeeServiceImpl.java:33)
    com.smart.controller.HomeController.loginWorld(HomeController.java:38)
    sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    java.lang.reflect.Method.invoke(Method.java:606)
    org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:221)
    org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:137)
    org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:110)
    org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandleMethod(RequestMappingHandlerAdapter.java:776)
    org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:705)
    org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:85)
    org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:959)
    org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:893)
    org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:967)
    org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:869)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:647)
    org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:843)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:728)
JamesENL
  • 6,400
  • 6
  • 39
  • 64
Harshit
  • 5,147
  • 9
  • 46
  • 93
  • 1
    Possible duplicate of [What is a Null Pointer Exception, and how do I fix it?](http://stackoverflow.com/questions/218384/what-is-a-null-pointer-exception-and-how-do-i-fix-it) – OPK Feb 12 '16 at 03:42
  • @FarazDurrani, it is not returning `long` but it is returning boolean `1>0 == true` – Harshit Feb 12 '16 at 04:01
  • Your second problem is caused because your TransactionManager bean has the id `transactionManager` but your `@Transactional` annotation has the bean name as `myTransactionManager` – JamesENL Feb 12 '16 at 04:05
  • Again I am getting the previous error NullPointerException. @JamesEnl – Harshit Feb 12 '16 at 04:19

2 Answers2

1

From the stacktrace it appears your code never calls validateLogin on the dao. The dao is null because there's nothing telling Spring to wire your DAO into your service. Add an @Autowired annotation to the setter in the service for the dao, similar to what you have in the controller wiring the service into it.

Nathan Hughes
  • 94,330
  • 19
  • 181
  • 276
  • I added `@Autowired` above `setEmployeeDAO(EmployeeDAO employeeDAO)` method, now I am getting different error. I updated my post above. – Harshit Feb 12 '16 at 04:00
1

It seems EmployeeDAO is not being injected in EmployeeServiceImpl, wire EmployeeDAO using @Autowire or @Inject, Second EmployeeDAOImpl has not been declared a component (not sure if you have declared already in xml) so declare it with @Repository and also @Autowire SessionFactory. Hope this will do..

Sindhoo Oad
  • 1,194
  • 2
  • 13
  • 29
SandeepGodara
  • 1,468
  • 16
  • 12