首页 > 解决方案 > 请求处理失败;嵌套异常是重定向中的 java.lang.NullPointerException?

问题描述

我正在制作一个 edairy 练习应用程序,我在尝试登录后收到以下错误消息:

Exception
org.springframework.web.util.NestedServletException: Request processing failed; nested exception is java.lang.NullPointerException

Root Cause
java.lang.NullPointerException
    hu.citec.spring.service.GlobalServiceClass.findSubjects(GlobalServiceClass.java:25)
    hu.citec.spring.controller.StudentController.student(StudentController.java:31)

我对这个主题很陌生,我尝试搜索它,但没有找到解决方案。也许这是一个非常基本的事情,但我不知道我忘记实施哪个合乎逻辑的步骤。我的程序现在看起来像这样:

学生控制器:

package hu.citec.spring.controller;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;

import hu.citec.spring.service.GlobalServiceClass;

@Controller
@RequestMapping("/student")
public class StudentController {
    @Autowired
    private GlobalServiceClass service;
    
    @GetMapping("/")
    public String student(Model model,HttpServletRequest request) {
        if(request.getSession(false).getAttribute("user") == null) {
            return "redirect:/login";
        }
        else {

        model.addAttribute("students", service.findStudents());
        model.addAttribute("subjectNames");
        model.addAttribute("subjectAverages");
        model.addAttribute("subjects", service.findSubjects());
        }
        return "student";
    }
    @PostMapping("/")
    public String subjects(Model model) {
        model.addAttribute("subjects", service.findSubjects());
        return "student";
        
    }
    
    
        
        @GetMapping("/logout")
    public String logout(HttpSession session ) {
        session.invalidate();
        return "login";
    } 
}

登录控制器:

package hu.citec.spring.controller;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;

import hu.citec.spring.service.GlobalServiceClass;

@Controller
public class LoginController {
    
    @Autowired
    private HttpServletRequest request;
    @Autowired
    private GlobalServiceClass service;

    @GetMapping("/login")
    public String login() {
        return "login";
    }

    @PostMapping("/login")
    public String doLogin(@RequestParam String htmlusername, Model model) {
        htmlusername = request.getParameter("htmlusername");
        String password = request.getParameter("htmlpassword");
    
        if ((service.finduser(htmlusername) == null
                || !service.finduser(htmlusername).getUserPassword().equals(password))) {
            String errorMsg = "Rossz felhasznalonev vagy jelszo!";
            model.addAttribute("wrong", errorMsg);

            return "login";
        } else if (service.finduser(htmlusername).getUserPassword().equals(password)
                && service.findUserRole(htmlusername).equalsIgnoreCase("admin")){
            HttpSession session = request.getSession(true);
            session.setAttribute("user", htmlusername);

            return "redirect:/admin/";
        } else if (service.finduser(htmlusername).getUserPassword().equals(password)
                && service.findUserRole(htmlusername).equalsIgnoreCase("diak")) {
            HttpSession session = request.getSession(true);
            session.setAttribute("user", htmlusername);

            return "redirect:/student/";
        } else if (service.finduser(htmlusername).getUserPassword().equals(password)
                && service.findUserRole(htmlusername).equalsIgnoreCase("szulo")) {
            HttpSession session = request.getSession(true);
            session.setAttribute("user", htmlusername);

            return "redirect:/student/";
        } else if (service.finduser(htmlusername).getUserPassword().equals(password)
                && service.findUserRole(htmlusername).equalsIgnoreCase("tanar")) {
            HttpSession session = request.getSession(true);
            session.setAttribute("user", htmlusername);
            model.addAttribute("students",service.findStudents());
        }
        return "redirect:/teacher/";
    }

学生html:

<!DOCTYPE html SYSTEM "http://www.thymeleaf.org/dtd/xhtml1-strict-thymeleaf-4.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
    xmlns:th="http://www.thymeleaf.org">
    <head>
        <title>Students</title>
        <meta charset="UTF-8" />
        <link rel="stylesheet" type="text/css" th:href="@{/static/main.css}" />
    </head>
    <body>
        <table class="table">
            <thead>
                <tr>
                    <th>Tantargy</th>
                    <th>Atlag</th>
                    <th>Minosites</th>

                </tr>
            </thead>
            <tbody>
                <tr th:if="${subjects.empty}">
                    <td colspan="5">No Subjects Available</td>
                </tr>
                <tr th:each="subject : subjects">
                    <td><span th:text="${subject.subjectName}"></span></td>
                </tr>
                <tr>
                    <td colspan="6">
                        <a th:href="@{/products/new}">Uj termek hozzaadasa</a>
                        <a th:href="@{/products/logout}">Kijelentkezes</a>
                    </td>
                </tr>
            </tbody>
        </table>
    </body>
</html>

登录html:

<!DOCTYPE html SYSTEM "http://www.thymeleaf.org/dtd/xhtml1-strict-thymeleaf-4.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
    xmlns:th="http://www.thymeleaf.org">
<head>
<title>Login</title>
<meta charset="UTF-8" />
<link rel="stylesheet" type="text/css" href="./static/main2.css" />
</head>
<body>

    <div class="form-wrapper">
        <h2>Please login!</h2>
        <h6 th:if="${wrong}">Rossz felhasznalonev es jelszo paros!</h6>
        <form name="loginForm" action="/NegyedikModulzaro/login" method="POST">
            <table>
                <tr>
                    <td>Felhasznalo nev:</td>
                    <td><input type="text" name="htmlusername" /></td>
                </tr>
                <tr>
                    <td>Jelszo:</td>
                    <td><input type="password" name="htmlpassword" /></td>
                </tr>
                <tr>
                    <td colspan="2" class="button-wrapper"><input
                        class="login-button" type="submit" value="Login" /></td>
                </tr>

                <tr>
                    <td colspan="6"><a th:href="@{/forgotPassword}">Elfelejtettem
                            a jelszavam</a> <a th:href="@{/registration}">Regisztracio</a></td>
                </tr>
            </table>
        </form>
    </div>
</body>
</html>

用户回购:

package hu.citec.spring.repository;

import java.util.List;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.dao.EmptyResultDataAccessException;
import org.springframework.dao.IncorrectResultSizeDataAccessException;
import org.springframework.jdbc.core.BeanPropertyRowMapper;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.SingleColumnRowMapper;
import org.springframework.stereotype.Repository;

import hu.citec.spring.entity.Subject;
import hu.citec.spring.entity.SubjectGrade;
import hu.citec.spring.entity.User;

@Repository
public class UserRepository {
    @Autowired
    private HttpServletRequest request;
    
    private JdbcTemplate jdbcTemplate;

    
    public UserRepository(JdbcTemplate jdbcTemplate) {
        this.jdbcTemplate = jdbcTemplate;
    }

    public User findUser(String name) {
        String query = "select * from users where username = ? or email = ?";

        Object[] args = new Object[] { name,name };
        try {
            User user = jdbcTemplate.queryForObject(query, args, (rs, rowNum) -> {
                User u = new User();
                u.setActivated(rs.getInt("activated"));
                u.setBlocked(rs.getInt("blocked"));
                u.setEmail(rs.getString("email"));
                u.setFullname(rs.getString("fullname"));
                u.setUserId(rs.getInt("user_id"));
                u.setPhoneNumber(rs.getDouble("phoneNumber"));
                u.setUsername(rs.getString("username"));
                u.setUserPassword(rs.getString("user_password"));
                u.setParent_id(rs.getInt("parent_id"));
                u.setStudent_id(rs.getInt("student_id"));
                return u;
            });
            return user;
        } catch (EmptyResultDataAccessException e) {
            return null;
        }
    }


    public String userRole(String username) {
        User loggedUser = findUser(username);
        String query = "select role.role_type from user_roles, role where user_roles.user_id =" + loggedUser.getUserId() + 
                " and role.role_id = user_roles.role_id";
        return jdbcTemplate.queryForObject(query, SingleColumnRowMapper.newInstance(String.class));
    }

//  public List<Subject> findUserSubject() {
//      String query = "SELECT fullname,subject_name,grade from subject,subject_grade,users where subject.subject_id = subject_grade.subject_id and subject_grade.user.id ='"
//              + session.getAttribute("userID");
//      return jdbcTemplate.query(query, BeanPropertyRowMapper.newInstance(SubjectGrade.class));
//  }
    
    public void addUser(User user) {
        String query = "INSERT INTO users (username, fullname, email, phoneNumber,user_id,user_password) VALUES (?, ?, ?, ?, ?, ?)";

        jdbcTemplate.update(query, user.getUsername(), user.getFullname(), user.getEmail(), user.getPhoneNumber(), user.getUserId(), user.getUserPassword());
    }
    public List<User> findAllStudentNamesByRoleId() {
        
        String query = "SELECT u.user_id, u.fullname FROM role r " +
                "INNER JOIN user_roles ur ON r.role_id = ur.role_id " +
                "INNER JOIN users u ON ur.user_id = u.user_id " +
                "WHERE ur.role_id = 2 ORDER BY u.fullname";        // if(roleId == 2) --> STUDENT
   
        List<User> findAllStudentNamesByRoleId =
                jdbcTemplate.query(query, BeanPropertyRowMapper.newInstance(User.class));
       
        return findAllStudentNamesByRoleId;
    }
    
    public void addTeacher(User user) {
        String insertTeacher = "INSERT INTO users (username, user_password, fullname, email, activated, blocked, phoneNumber) VALUES(?,?,?,?,?,?,?)";
        jdbcTemplate.update(insertTeacher, user.getUsername(), user.getUserPassword(), user.getFullname(), user.getEmail(), user.getActivated(), user.getBlocked(), user.getPhoneNumber());
       
        String getActualTeacherID = "SELECT users.user_id FROM users WHERE users.username = ?";
        Integer actualTeacherID = jdbcTemplate.queryForObject(getActualTeacherID, SingleColumnRowMapper.newInstance(Integer.class),user.getUsername());
        String insertTeacherRole = "INSERT INTO `user_roles`(`user_id`, `role_id`) VALUES (?,4)";
        jdbcTemplate.update(insertTeacherRole, actualTeacherID);
    }
    public List<User> listTeachers(){
        String query = "SELECT users.user_id as usedId, users.username, users.fullname, users.email, users.activated, users. blocked, users.phoneNumber" 
                + " FROM ((user_roles "
                + " INNER JOIN role ON user_roles.role_id = role.role_id) "
                + " INNER JOIN users ON user_roles.user_id = users.user_id) "
                + " WHERE user_roles.role_id = 4";
        return jdbcTemplate.query(query, BeanPropertyRowMapper.newInstance(User.class));
    }
    
    public List<SubjectGrade> findAllSubjectGrades(){
        String query = "SELECT id, subject_id, user_id, grade_date as date, descrioption AS description, teacher_id, grade  FROM subject_grade";
        
        return jdbcTemplate.query(query, BeanPropertyRowMapper.newInstance(SubjectGrade.class));
    }
    public User findUserByStudentOrParentId(Integer id) {
        try {
            String query = "SELECT * users WHERE parent_id = ? or student_id = ?";
            
            return (User) jdbcTemplate.queryForObject(query, new BeanPropertyRowMapper(User.class), id,id);

        } catch (IncorrectResultSizeDataAccessException ex) {
            return null;
        }
    }
    public List<SubjectGrade> subjectsAndAveragesPerStudent(int userId) {   
           
        String query = "SELECT subject.subject_id, subject.subject_name, (AVG(subject_grade.grade), 2), ROUND(AVG(subject_grade.grade), 0) FROM subject_grade "
                + "INNER JOIN subject ON subject.subject_id = subject_grade.subject_id "
                + "WHERE subject_grade.user_id = ? "
                + "GROUP BY subject.subject_name";
               
        List<SubjectGrade> subjectsAndAveragesPerStudent =
                jdbcTemplate.query(query, BeanPropertyRowMapper.newInstance(SubjectGrade.class), userId);
       
        return subjectsAndAveragesPerStudent;
    }
    
}

主题等级仓库:

package hu.citec.spring.repository;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;

import javax.servlet.http.HttpServletRequest;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.dao.EmptyResultDataAccessException;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Repository;

import hu.citec.spring.entity.Subject;
import hu.citec.spring.entity.User;

@Repository
public class SubjectGradeRepository {
    @Autowired
    private HttpServletRequest request;

    private JdbcTemplate jdbcTemplate;

    public SubjectGradeRepository(JdbcTemplate jdbcTemplate) {
        this.jdbcTemplate = jdbcTemplate;
    }

    public List<Subject> findAll() {

        String sql = "SELECT * FROM subject";

        return jdbcTemplate.query(sql, (rs, rowNum) -> new Subject(rs.getInt("subjectId"), rs.getString("subjectName")

        ));
    }
       public List<Subject> findAll2() {

            String sql = "SELECT * FROM subject";

            List<Subject> subjects = new ArrayList<>();

            List<Map<String, Object>> rows = jdbcTemplate.queryForList(sql);

            for (Map row : rows) {
                Subject obj = new Subject();

                obj.setSubjectId(((Integer) row.get("subjectId")));
                obj.setSubjectName((String) row.get("subjectName"));
                // Spring returns BigDecimal, need convert
            
                subjects.add(obj);
            }

            return subjects;
        }
}

为了使程序正常工作,我尝试了两种不同的方法,但我仍然得到 nullPointerException;我在重定向方面做错了吗?我真的不知道如何操纵他们......

标签: javahtml

解决方案


好的,我意识到了问题:

package hu.citec.spring.service;

import java.util.List;

import org.springframework.stereotype.Service;

import hu.citec.spring.entity.Subject;
import hu.citec.spring.entity.User;
import hu.citec.spring.repository.SubjectGradeRepository;
import hu.citec.spring.repository.SubjectRepository;
import hu.citec.spring.repository.UserRepository;

@Service
public class GlobalServiceClass {

    private UserRepository userRepo;
    private SubjectRepository subjectRepo;
    private SubjectGradeRepository sgrepo;

    public GlobalServiceClass(UserRepository userRepo, SubjectRepository subjectRepo, SubjectGradeRepository sgrepo) {

        this.userRepo = userRepo;
        this.subjectRepo = subjectRepo;
        this.sgrepo = sgrepo;
    }
    public List<Subject>findSubjects(){
        return sgrepo.findAll2();
    }

    public User finduser(String name) {
        return userRepo.findUser(name);
    }

    public String findUserRole(String username) {
        return userRepo.userRole(username);
    }

    public List<User> findStudents() {
        return userRepo.findAllStudentNamesByRoleId();
    }

    public User findUserById(Integer id) {
        return userRepo.findUserByStudentOrParentId(id);
    }
    public void addTeacher(User user) {
        userRepo.addTeacher(user);
    }
    public List<User> listTeachers() {
        return userRepo.listTeachers();
    }
    public void addUser(User user) {
        userRepo.addUser(user);
    }

    public Object subjectsAndAveragesPerStudent(int userId) {
        // TODO Auto-generated method stub
        return null;
    }
}

我忘了添加

this.subjectRepo = subjectRepo;
this.sgrepo = sgrepo;

进入服务的构造函数。现在程序可以工作了,我现在遇到了不同的问题。不过谢谢各位!


推荐阅读