2016-02-12 88 views
-5

我正在嘗試創建一個應用程序,以解決問題。下面是代碼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://stackoverflow.com/questions/218384/what-is-a-null-pointer – OPK

+0

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

+0

你的第二個問題是因爲你的TransactionManager bean有id爲'transactionManager',但你的'@Transactional'註解的bean名稱爲'myTransactionManager' – JamesENL

回答

1

看來EmployeeDAO沒有被注入EmployeeServiceImpl,電線EmployeeDAO使用@Autowire@Inject,二EmployeeDAOImpl尚未聲明組件(不知道你是否已經在XML聲明的話),因此與@Repository@Autowire SessionFactory聲明。希望這會做..

+0

'@Autowire SessionFactory'工作! –

1

從它出現在您的代碼在DAO從未稱validateLogin堆棧跟蹤。道是空的,因爲沒有什麼能讓Spring將你的DAO連接到你的服務中。在爲dao服務的setter中添加@Autowired註釋,類似於控制器將服務連接到它的控制器。

+0

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