Spring项目Upvote按钮报Required parameter 'votes'缺失错误求助
Spring项目Upvote功能400 Bad Request错误原因及修复
问题现象
开发Java Spring项目时,Quote的编辑功能正常运行,但点击Upvote按钮尝试增加票数时,触发400 Bad Request错误,错误信息为Required parameter 'votes' is not present,对应异常org.springframework.web.bind.MissingServletRequestParameterException。
核心原因
- 前后端参数传递不匹配:
投票接口VoteUp方法通过@RequestParam int votes声明必须接收votes参数,但前端的Upvote表单仅包含提交按钮,没有任何字段传递当前Quote的票数值,导致请求缺少必填参数,触发400错误。 - 冗余配置导致逻辑异常:
VoteUp方法添加了@ResponseBody注解,但返回值是重定向字符串,这会让Spring直接把redirect:/profile作为响应内容返回,而非执行重定向逻辑,属于无效且错误的配置。
修复方案
方案一:前端传递票数(不推荐,存在篡改风险)
在Upvote表单中添加隐藏字段,传递当前Quote的票数:
<form th:action="'/profile/' + ${el.id} + '/upvote'" method="post"><br> <!-- 添加隐藏字段传递当前票数 --> <input type="hidden" th:value="${el.votes}" name="votes"> <button class="btn btn-warning" type="submit">Upvote</button><br> </form>
方案二:后端直接读取数据库票数(推荐,安全可靠)
移除对前端votes参数的依赖,直接从数据库查询当前Quote的票数并累加,避免前端篡改数据:
@PostMapping("/profile/{id}/upvote") public String VoteUp(@PathVariable(value="id") long id) { Quote post = quoteRepository.findById(id).orElseThrow(); // 直接从数据库查询的实体中获取当前票数并加1 post.setVotes(post.getVotes() + 1); quoteRepository.save(post); return "redirect:/profile"; }
同时移除无用的@ResponseBody注解和Model model参数,确保重定向逻辑正常执行。
为什么编辑功能正常?
编辑接口的QuoteEdit方法同样需要votes参数,但编辑页面的表单(edit_quote.html)必然包含了传递当前票数的字段(如隐藏输入框或可编辑输入框),因此请求能携带完整参数,功能正常运行。
内容的提问来源于stack exchange,提问作者Farkhad
相关产品推荐
相关产品推荐

