java - 请求处理失败;嵌套异常是重定向中的 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;我在重定向方面做错了吗?我真的不知道如何操纵他们......
解决方案
好的,我意识到了问题:
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;
进入服务的构造函数。现在程序可以工作了,我现在遇到了不同的问题。不过谢谢各位!
推荐阅读
- oracle - 使用 Oracle SQL Developer 转换 Unix 时间戳?
- flutter - 如何在没有 PageView 的情况下使用 jumpToPage 内页
- java - 在扫雷中递归显示相邻的空白地雷
- kubernetes - 如何使用自定义映像在 Ansible 中创建 Google Kubernetes (GKE) 集群?
- vba - 调试 MS Word 宏以导入返回重复图像的 JPG
- c - 在 C 中使用链表不正确地实现堆栈数据类型
- git - git push 无法在 docker 上使用 Gitea 和 traefik 和 basicauth
- asp.net-core - ASP.NET MVC 客户端的混合流身份验证
- docker - 由于连接超时错误,无法构建 docker 映像
- ios - iOS - 启动 Siri 意图时 AppDelegate 未检索 userActivity