2016-10-24 3 views
0

Я совершенно не знаком с Spring (MVC) и Hibernate, и я пытаюсь его изучить.Spring/Hibernate - NullPointerException

Я составил следующий сценарий аутентификации, но мне не очень повезло, что он работает.

Сценарий:

У меня есть HTML-форму (homepageForm.jsp), который отправляет имя пользователя и пароль для HomeController. HomeController получает параметры формы (имя пользователя/пароль) и сравнивает параметры формы с именем пользователя & пароль, полученный из базы данных.

Если есть совпадение, пользователь будет представлен с помощью dashboard.jsp. Если есть несоответствие, вместо этого будет загружена ошибка.jsp.

Информация из базы данных получена «UserRetrievalService».

Я получаю следующее сообщение об ошибке:

:::: ОШИБКА

type Exception report 

    message Request processing failed; nested exception is java.lang.NullPointerException 

    description The server encountered an internal error that prevented it from fulfilling this request. 

    exception 
    org.springframework.web.util.NestedServletException: Request processing failed; nested exception is java.lang.NullPointerException 
     org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:982) 
     org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:872) 
     javax.servlet.http.HttpServlet.service(HttpServlet.java:648) 
     org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:846) 
     javax.servlet.http.HttpServlet.service(HttpServlet.java:729) 
     org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52) 


    root cause 
    java.lang.NullPointerException 
     com.springdemo.mvc.HomeController.processLoginForm(HomeController.java:91) 
     sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
     sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 
     sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 

Я подозреваю, что это связано с тем, как ссылается servlet.xml. Строка 91 в HomeController это одна:

User user = userRetrievalService.getUser(); 

или, возможно, я использую @Autowired неправильно.

Может ли кто-нибудь, пожалуйста, дать мне несколько советов, как разрешить это?

Спасибо!

Вот еще дополнительная информация о проекте.

enter image description here

**** 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:context="http://www.springframework.org/schema/context" 
     xmlns:mvc="http://www.springframework.org/schema/mvc" 
     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/mvc 
      http://www.springframework.org/schema/mvc/spring-mvc.xsd"> 

     <context:component-scan base-package="com.springdemo.mvc" /> 
     <context:component-scan base-package="com.springdemo.model" /> 

     <mvc:annotation-driven/> 

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

    </beans> 

**** web.xml

<?xml version="1.0" encoding="UTF-8"?> 
    <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1"> 
     <display-name>spring-mvc-demo</display-name> 
     <servlet> 
     <servlet-name>dispatcher</servlet-name> 
     <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> 
     <init-param> 
      <param-name>contextConfigLocation</param-name> 
      <param-value>/WEB-INF/servlet.xml</param-value> 
     </init-param> 
     <load-on-startup>1</load-on-startup> 
     </servlet> 
     <servlet-mapping> 
     <servlet-name>dispatcher</servlet-name> 
     <url-pattern>/</url-pattern> 
     </servlet-mapping> 
    </web-app> 

**** homepageForm.jsp

<html> 
    <head> 
    <title>Homepage Form</title> 
    </head> 

    <body> 
     <form action="processLogin" method="POST"> 
      <div> 
       <label>Username</label> <input type="text" name="username" placeholder="username" /> 
      </div> 
      <div> 
       <label>Password</label> <input type="text" name="password" placeholder="password" /> 
      </div> 
      <input type="submit" value="Login" /> 
     </form> 
    </body> 

    </html> 

**** User.java

package com.springdemo.model; 

    import javax.persistence.Column; 
    import javax.persistence.Entity; 
    import javax.persistence.Id; 
    import javax.persistence.Table; 

    @Entity 
    @Table(name = "user") 
    public class User implements AbstractUser { 

     @Id 
     @Column(name = "id") 
     private int id; 

     @Column(name = "username") 
     private String username; 

     @Column(name = "password") 
     private String password; 

     @Column(name = "first_name") 
     private String firstname; 

     @Column(name = "last_name") 
     private String lastname; 

     @Column(name = "email") 
     private String email; 

     public User() { 

     } 

     public User(int id, String username, String password, String firstname, String lastname, String email) { 
      super(); 
      this.id = id; 
      this.username = username; 
      this.password = password; 
      this.firstname = firstname; 
      this.lastname = lastname; 
      this.email = email; 
     } 

     + getters & setters 

    } 

**** UserService

public interface UserService { 

     public User getUser(); 
    } 

**** UserRetrievalService

import org.hibernate.Session; 
    import org.hibernate.SessionFactory; 
    import org.hibernate.cfg.Configuration; 
    import org.springframework.stereotype.Component; 

    @Component 
    public class UserRetrievalService implements UserService { 

     @Override 
     public User getUser() { 

      System.out.println("UserRetrievalService called..."); 

      Configuration config = new Configuration().configure("hibernate.cfg.xml"); 
      config.addAnnotatedClass(User.class); 

      SessionFactory sessionFactory = config.buildSessionFactory(); 

      // create a session 
      Session session = sessionFactory.getCurrentSession(); 

      try { 

       // start trans 
       session.beginTransaction(); 

       // get & create user 
       User user = session.get(User.class, 1); 

       // commit trans 
       session.getTransaction().commit(); 

       System.out.println("UserRetrievalService : commit successful..."); 

       System.out.println(" >>>> USER: " + user.getId() + " " + user.getUsername() + " " + user.getPassword() + " " + user.getFirstname() + " " + user.getLastname()); 

       return user; 

      } finally { 
       sessionFactory.close(); 
      } 

     } 

    } 

**** HomeController.java

import javax.servlet.http.HttpServletRequest; 

    import org.springframework.stereotype.Controller; 
    import org.springframework.web.bind.annotation.RequestMapping; 
    import org.springframework.web.servlet.ModelAndView; 

    import com.springdemo.model.User; 
    import com.springdemo.model.UserRetrievalService; 

    @Controller 
    public class HomeController { 

    ... 
    private UserRetrievalService userRetrievalService; 

    @Autowired 
    public UserRetrievalService getUserRetrievalService() { 
     return userRetrievalService; 
    } 

    @RequestMapping("/processLogin") 
    public ModelAndView processLoginForm(HttpServletRequest request) { 

     String username = request.getParameter("username"); 
     String password = request.getParameter("password"); 

     System.out.println("username : " + username); 
     System.out.println("password : " + password); 

     User user = userRetrievalService.getUser(); 

     ModelAndView modelAndView; 

     if (username.equalsIgnoreCase(user.getUsername()) && (password.equalsIgnoreCase(user.getPassword()))) { 
      modelAndView = new ModelAndView("dashboard"); // page to be returned 
     } else { 
      modelAndView = new ModelAndView("error"); // page to be returned 
     } 

     // System.out.println("success: user id = " + user.getId()); 

     modelAndView.addObject("myUser", user); 

     return modelAndView; 
    } 
    ... 
    } 

::::: hibernate.cfg.XML

<!DOCTYPE hibernate-configuration PUBLIC 
      "-//Hibernate/Hibernate Configuration DTD 3.0//EN" 
      "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd"> 

    <hibernate-configuration> 

     <session-factory> 

      <!-- JDBC Database connection settings --> 
      <property name="connection.driver_class">com.mysql.jdbc.Driver</property> 
      <property name="connection.url">jdbc:mysql://localhost:3306/springtestdb?useSSL=false</property> 
      <property name="connection.username">*****</property> 
      <property name="connection.password">*****</property> 

      <!-- JDBC connection pool settings ... using built-in test pool --> 
      <property name="connection.pool_size">1</property> 

      <!-- Select our SQL dialect --> 
      <property name="dialect">org.hibernate.dialect.MySQLDialect</property> 

      <!-- Echo the SQL to stdout --> 
      <property name="show_sql">true</property> 

      <!-- Set the current session context --> 
      <property name="current_session_context_class">thread</property> 

     </session-factory> 

    </hibernate-configuration> 
+0

сервер whar вы используете? Кот? можете ли вы показать свой '' hibernate.cfg.xml''? –

+0

@DonaldWu - hibernate.cfg.xml, добавленный в мой вопрос ... с помощью Tomcat 8 – BustedSanta

+0

'@ Autowired' используется для ввода beans в поля/конструкторы. Если вы хотите что-то вернуть, используйте '@ ModelAttribute' –

ответ

2

Ваш UserRetrievalService не правильно введен.

Вы можете использовать функцию @Autowired или Constructor/Setter. В вашем случае вы использовали сеттер инъекцию, но не надлежащим образом

Это должно быть как

частного UserRetrievalService userRetrievalService;

@Autowired 
public UserRetrievalService setUserRetrievalService(UserRetrievalService userRetrievalService) { 
    this.userRetrievalService = userRetrievalService; 
} 

Предложение относительно конфигурации спящего режима.

Вы должны держать hibernate.cfg.xml под классами

Как ваш проект является Maven, идеальное место будут /SRC/основные/ресурсов/

Пожалуйста, обратитесь к https://stackoverflow.com/a/29352557/7063373 более ясность.

+0

спасибо! Инъекция была определенно неправильной. Каталог My/src/main/resources отсутствует. Я изначально создавал динамический веб-проект и преобразовывал его в проект Maven ... проблема остается ... Я отправлю решение, когда выясню это. В любом случае, спасибо! – BustedSanta

+0

уверенный .. мое предложение, так как я заметил, что pom.xml и структура каталогов не придерживаются maven. Я использовал старый способ, как создание динамического проекта и внесение изменений, таких как ANT, и maven, gradle позже. Но как только я оставил этот подход и начал работать с MAVEN, это было потрясающе. Определенно я рекомендую MAVEN для любого из моих друзей-разработчиков. Это делает структуру проекта более организованной. Как вы сказали **, вы новичок в Spring **, я предлагаю вам пойти ** maven/gradle ** way –

+0

Я выбираю это как ответ (решение) на мой вопрос. Мне пришлось сделать две вещи, чтобы решить мою проблему. Оба они были предложены в этом ответе. 1. Я должен был исправить мою инъекцию зависимости. 2. Я создал новый проект Maven с нуля, который создал «правильную» структуру каталогов, включая каталоги «src/main/java» и «src/main/resources». Я передал исходный код из одного проекта в другой, включая перенос hibernate.cfg.xml в «src/main/resources». Затем код выполнялся так, как ожидалось. Так спасибо сатья-д! – BustedSanta

2

В соответствии с Javadoc для Autowired, аннотации могут быть использованы на «конструктора, поле, сеттер метода или метода» конфигурации. В HomeController добавьте аннотацию Autowired в поле обслуживания.

@Autowired 
private UserRetrievalService userRetrievalService;