Map控制器的spring问题

egmofgnx  于 2021-07-13  发布在  Java
关注(0)|答案(3)|浏览(342)

我完全无法将控制器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 courseIdvalue = "/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 错了吗?

lymnna71

lymnna711#

你的控制器看起来不错。你能检查一下你是否用@autowired annotation注解了你的courseservice和userservice吗。

@Autowired
private CourseService courseService

如果无法解决问题,请共享错误消息。

bd1hkmkf

bd1hkmkf2#

我知道这样您就可以访问添加到模型中的用户值,并始终创建每个属性的相应getter和setter:

<select class="form-control" id="userName" th:name="userName">
    <option th:each="student : ${users}" th:value="${student.email}" 
     th:text="${student.email}"></option>
</select>
ve7v8dk2

ve7v8dk23#

终于找到答案了!而不是试图通过 model.addAttribute ,按如下方式添加:

@ModelAttribute("users")
    public List<User> users() {
        return userService.findAll();
    }

我仍然不能告诉你为什么另一种方法不起作用,但至少有一种是有效的。

相关问题