【问题标题】:Required String Parameter is not present?必需的字符串参数不存在?
【发布时间】:2021-04-01 08:07:30
【问题描述】:

我的 Spring Boot 项目在 /albums/add 有一个表单,如下所示:

<form method="post">
    <input type="text" name="albumName"/>
    <input type="submit" value="Add album"/>
</form>

我正在尝试在下面的控制器中处理该请求:

@Controller
@RequestMapping(value = "/albums")
public class AlbumController {

(...)

    @PostMapping("/add")
    public String processAddAlbumForm(@RequestParam String albumName) {
        albums.add(albumName);
        return "redirect:";
    }

}

但是,Spring 抛出 400 并告诉我“必需的字符串参数 'albumName' 不存在”。

如果我在浏览器中查看“网络”选项卡,我可以看到请求到达时带有“表单数据”标题下的 albumName 值,而 @RequestParam 注释似乎找不到它。

我的代码是直接从 this tutorial 复制而来,但我担心某些东西可能会在制作后被弃用 - 有什么想法吗?

【问题讨论】:

  • 您的form 没有action。你的控制器将如何被调用?

标签: java spring-mvc mapping http-request-parameters


【解决方案1】:

@RequestParam 用于从 URL 中检索参数,但它也可以从 HTTP POST 请求中检索参数,并且您的代码在我的本地运行得很好。我看到的是我被发送到白标错误页面,这是您指的错误吗?在任何情况下,我都看不到任何 500 被返回或日志中的任何异常。如果您添加 @ResponseBody 注释,您将能够在响应正文中发送一个字符串:

@PostMapping("/add")
@ResponseBody
public String processAddAlbumForm(@RequestParam String albumName) {
    albums.add(albumName);
    return "redirect:";
}

如果您想避免在每种方法中使用@ResponseBody,您可以使用@RestController 而不是@Controller,默认情况下将假定@ResponseBody

我用来测试端点的html如下,复制你的一段html并添加action属性来指定我的应用程序的端点:

<form action="http://localhost:8080/albums/add" method="post">
    <input type="text" name="albumName"/>
    <input type="submit" value="Add album"/>
</form>

@RequestBody 注解通常在您在发布请求的正文中传递信息时使用,通常为 json 格式。在这种情况下,您的表单将不得不发送一个像 {"albumName": "my amazing album"} 这样的 json 字符串。

更新

所以,我检查了您的存储库,但它实际上无法正常工作。将以下依赖项添加到您的 pom.xml 可以使我建议的代码正常工作:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>

【讨论】:

  • 你知道我将如何将它用于上面的代码吗?我试过 @RequestBody String body@RequestBody Album album (其中专辑是一个简单的数据类),但在每种情况下我都会收到 500 错误。
  • @Liam 您可以发布您的 POST 请求的详细信息吗?
  • 嗨@burm87 - 我已经按照您的建议进行了更改,但不幸的是我仍然遇到问题!我设法使用@ModelAttribute 注释来解决该实例中的问题,但现在有另一个类似的用例,我想从表单中接收整数数组,我无法弄清楚 - 第 44 行 here
  • @Liam 我已经更新了我的答案,看看并告诉我。我认为您的 pom.xml 缺少 starter-web 依赖项
  • 宾果游戏!看起来依赖已经成功了 - 非常感谢,我自己永远也想不通:)
猜你喜欢
  • 2019-09-23
  • 2018-05-03
  • 1970-01-01
  • 2017-11-27
  • 2017-11-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多