Spring MVC服务类NullPointerException

问题描述:

我正在尝试创建一个应用程序,以解决问题。下面是代码Spring MVC服务类NullPointerException

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; 

    }  
} 

欢迎-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> 

错误

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) 

我得到的EmployeeServiceImpl.java在这条线

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

看来我正在从validateLogin功能空虽然我从validateLogin函数是返回值。为什么我得到空?

编辑

现在错误

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) 
+1

可能重复[什么是空指针异常,以及如何解决它?](http://*.com/questions/218384/what-is-a-null-pointer – OPK

+0

@FarazDurrani,它没有返回'long',但它返回布尔值'1> 0 == true' –

+0

你的第二个问题是因为你的TransactionManager bean有id为'transactionManager',但你的'@Transactional'注解的bean名称为'myTransactionManager' – JamesENL

看来EmployeeDAO没有被注入EmployeeServiceImpl,电线EmployeeDAO使用@Autowire@Inject,二EmployeeDAOImpl尚未声明组件(不知道你是否已经在XML声明的话),因此与@Repository@Autowire SessionFactory声明。希望这会做..

+0

'@Autowire SessionFactory'工作! –

从它出现在您的代码在DAO从未称validateLogin堆栈跟踪。道是空的,因为没有什么能让Spring将你的DAO连接到你的服务中。在为dao服务的setter中添加@Autowired注释,类似于控制器将服务连接到它的控制器。

+0

我在'setEmployeeDAO(EmployeeDAO employeeDAO)'方法上面加了'@ Autowired',现在我得到了不同的错误。我上面更新了我的帖子。 –