我完全无法将控制器Map到url。我已经搜索了不少,但不能找出我做错了什么,除了从Map只是没有发生的事实。包括的零件是目前唯一不起作用的零件。
控制器代码(较大控制器文件的一部分,带有另一个值为的控制器方法) "/course_users"
)
@RequestMapping(value = "/new_users", method = RequestMethod.GET)
public String addStudent(
Model model,
Principal principal,
HttpServletRequest requestID, HttpServletRequest requestName)
{
Long courseId = Long.parseLong(requestID.getParameter("id"));
User currentUser = userService.findByEmail(principal.getName());
Course currentCourse = courseService.findCourseById(courseId);
model.addAttribute("user", currentUser);
model.addAttribute("courseId", courseId);
try{
if(!currentUser.getRoles().contains(Role.ADMIN) && !currentUser.getRoles().contains(Role.LECTURER)){
String errorMsg = "Nie masz wystarczających uprawnień, aby dodać kursanta";
model.addAttribute("errorMsg", errorMsg);
return "error";
}
List<User> users = userService.findAll();
model.addAttribute("users", users);
String userName = requestName.getParameter("userName");
User newStudent = userService.findByEmail(userName);
courseService.addStudentToCourse(currentCourse, newStudent);
}
catch (IllegalArgumentException e){
String errorMsg = "Podano nieprawidłowe argumenty podczas tworzenia kursu.";
model.addAttribute("errorMsg", errorMsg);
return "error";
}
return "course_users";
}
html文件代码(文件名为“course\u users.html”)
<div class="container pb-3">
<form th:action="@{/new_users}">
<div class="form-group">
<label for="userName">Dodawany Student:</label>
<select class="form-control" id="userName" th:name="userName">
<option th:each="student : ${users}" th:value="${student.getEmail()}" th:text="${student.getEmail()}"></option>
</select>
</div>
<div class="pt-3">
<button type="submit" class="btn btn-primary">Dodaj studenta</button>
</div>
</form>
编辑
userservice的相关部分(课程服务的注解方式相同)
@Service
public class UserService {
private final UserRepository userRepository;
@Autowired
public UserService(UserRepository userRepository) {
this.userRepository = userRepository;
}
//rest of service code
}
错误位于标头中,正在尝试调用 getFirstName()
在 user
,它似乎没有得到(为什么我假设控制器没有得到Map)。
我在第一个方法中遇到了相同的问题(和错误),在这里我交换了 @PathVriable
为了 HttpServletRequest
这解决了问题,可惜这里没有这样的运气。
Method call: Attempted to call method getFirstName() on null context object
我觉得这很可能是因为一些我一直错过的很小的事情造成的。
编辑2
我决定再试试看会发生什么 @RequestParam(value = "userName") String userName
以及 @PathVariable("courseId") Long courseId
与 value = "/new_users/{courseId}"
在我调换之前都是一样的
<option th:each="student : ${users}" th:value="${student.getEmail()}" th:text="${student.getEmail()}"></option>
具有
<option th:each="student : ${course.getEnrolledStudents()}" th:value="${student.getEmail()}" th:text="${student.getEmail()}"></option>
它在选择列表中显示了一个条目,并在单击按钮时给了我一个预期的错误页(因为我第二次尝试添加同一个人)
可能是我在用html语法搞砸了什么,或者使用/添加了模型变量 users
错了吗?
3条答案
按热度按时间lymnna711#
你的控制器看起来不错。你能检查一下你是否用@autowired annotation注解了你的courseservice和userservice吗。
如果无法解决问题,请共享错误消息。
bd1hkmkf2#
我知道这样您就可以访问添加到模型中的用户值,并始终创建每个属性的相应getter和setter:
ve7v8dk23#
终于找到答案了!而不是试图通过
model.addAttribute
,按如下方式添加:我仍然不能告诉你为什么另一种方法不起作用,但至少有一种是有效的。