请求处理失败;嵌套异常是重定向中的java.lang.NullPointerException吗?

请求处理失败;嵌套异常是重定向中的java.lang.NullPointerException吗?,java,html,Java,Html,我正在制作edairy practice应用程序,尝试登录后收到以下错误消息: Exception org.springframework.web.util.NestedServletException: Request processing failed; nested exception is java.lang.NullPointerException Root Cause java.lang.NullPointerException hu.citec.spring.servic

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

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/";
    }
登录控制器:

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>

登录
请登录!
Rossz felhasznalonev是jelszo paros!
内华达州费哈兹纳洛:
杰尔佐:
用户报告:

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;
    }
    
}
包hu.citec.spring.repository;
导入java.util.List;
导入javax.servlet.http.HttpServletRequest;
导入javax.servlet.http.HttpSession;
导入org.springframework.beans.factory.annotation.Autowired;
导入org.springframework.dao.EmptyResultDataAccessException;
导入org.springframework.dao.incorrectresultsizedaataaccessexception;
导入org.springframework.jdbc.core.beanpropertyrowapper;
导入org.springframework.jdbc.core.jdbc模板;
导入org.springframework.jdbc.core.SingleColumnRowMapper;
导入org.springframework.stereotype.Repository;
导入hu.citec.spring.entity.Subject;
导入hu.citec.spring.entity.SubjectGrade;
导入hu.citec.spring.entity.User;
@存储库
公共类用户存储库{
@自动连线
私有HttpServletRequest;
私有JdbcTemplate JdbcTemplate;
公共用户存储库(JdbcTemplate JdbcTemplate){
this.jdbcTemplate=jdbcTemplate;
}
公共用户findUser(字符串名称){
String query=“从用户名=?或电子邮件=?”的用户中选择*”;
Object[]args=新对象[]{name,name};
试一试{
User User=jdbcTemplate.queryForObject(查询,参数,(rs,rowNum)->{
用户u=新用户();
u、 setActivated(rs.getInt(“activated”);
u、 已锁定(rs.getInt(“已锁定”);
u、 setEmail(rs.getString(“email”);
u、 setFullname(rs.getString(“fullname”);
u、 setUserId(rs.getInt(“用户id”);
u、 setPhoneNumber(rs.getDouble(“phoneNumber”);
u、 setUsername(rs.getString(“用户名”);
u、 setUserPassword(rs.getString(“用户密码”);
u、 setParent_id(rs.getInt(“parent_id”);
u、 设置学生id(rs.getInt(“学生id”);
返回u;
});
返回用户;
}捕获(EmptyResultDataAccessE异常){
返回null;
}
}
公共字符串用户角色(字符串用户名){
用户loggedUser=findUser(用户名);
String query=“从用户角色中选择角色.role\u类型,角色中的用户角色.user\u id=“+loggedUser.getUserId()+
“and role.role\u id=用户\u角色.role\u id”;
返回jdbcTemplate.queryForObject(查询,SingleColumnRowMapper.newInstance(String.class));
}
//公共列表findUserSubject(){
//String query=“选择全名、科目名称、科目成绩、科目成绩、用户,其中subject.subject\u id=subject\u grade.subject\u id和subject\u grade.user.id=”
//+session.getAttribute(“userID”);
//返回jdbcTemplate.query(query,BeanPropertyRowMapper.newInstance(SubjectGrade.class));
//  }
public void addUser(用户){
String query=“插入用户(用户名、全名、电子邮件、电话号码、用户id、用户密码)值(?,,,,,,?,?)”;
更新(查询,user.getUsername(),user.getFullname(),user.getEmail(),user.getPhoneNumber(),user.getUserId(),user.getUserPassword());
}
公共列表findAllStudentNamesByRoleId(){
String query=“从角色r中选择u.user\u id、u.fullname”+
“内部加入用户角色ur ON r.role\u id=ur.role\u id”+
“ur.user\u id=u.user\u id上的内部加入用户u”+
“其中ur.role_id=2按u.fullname排序”;//如果(roleId==2)-->学生
列出findAllStudentNamesByRoleId=
query(query,BeanPropertyRowMapper.newInstance(User.class));
返回findAllStudentNamesByRoleId;
}
公共void addTeacher(用户){
String insertTeacher=“插入用户(用户名、用户密码、全名、电子邮件、已激活、已阻止、电话号码)值(?、、?、?、?、?、?)”;
更新(insertTeacher、user.getUsername()、user.getUserPassword()、user.getFullname()、user.getEmail()、user.getActivated()、user.getBlocked()、user.getPhoneNumber());
String GetActualTech id=“从users.username=?”所在的用户中选择users.user\u id”;
Integer actualTeacherID=jdbcTemplate.queryForObject(getActualTeacherID,SingleColumnRowMapper.newInstance(Integer.class),user.getUsername());
String insertTeacherRole=“插入到`user\u roles`(`user\u id`,`role\u id`)值(?,4)”;
更新(insertTeacherRole,actualTeacherID);
}
公开教师名单{
String query=“选择users.user\u id作为usedId、users.username、users.fullname、users.email
this.subjectRepo = subjectRepo;
this.sgrepo = sgrepo;