【问题标题】:Spring sets @PostMapping fields from GET url query?Spring从GET url查询中设置@PostMapping字段?
【发布时间】:2021-10-30 21:47:23
【问题描述】:

我的设置如下: 我在同一页面上有一个表格和一个表格:localhost:8080/persons?firstname=frank

这会相应地显示所有有名字的人。 在同一页面上,可以提交创建新人员的表单:

<form action="/persons" method="POST">
    <input type="hidden" name="_method" value="POST"/>
    <input type="text" name="firstname"/>
    <input type="text" name="lastname"/>
    <input type="submit" value="Create"/>
</form>

问题:当我实际上将POST表单内容发送到Spring@Controller时,会发送以下内容:

网址:/persons?firstname=frank

请求正文:_method=post&amp;firstname=&amp;lastname=doe

Spring 然后神奇地将 GET 查询参数和 POST 表单参数合并到一个 DTO 中,并生成一个同时设置了名字 + 姓氏的 PersonDto

@PostMapping("/persons")
public void addPerson(PersonDto p) {
    //p.firstname => Frank, p.lastname = Doe
}

PersonDto {
    public String firstname, lastname, age;
}

Spring 不知何故从 get-query url 参数中导出请求正文值。为什么??

【问题讨论】:

    标签: java html spring spring-mvc


    【解决方案1】:

    据我所知,就像您可以将请求正文映射到一个对象一样,您也可以使用查询参数来做到这一点。

    原因可能如下:

    在Spring MVC中,“请求参数”映射到查询参数,形式 数据和多部分请求中的部分。这是因为 Servlet API 将查询参数和表单数据组合到一个名为 “参数”,其中包括请求正文的自动解析。

    参考文档:https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/web/bind/annotation/RequestParam.html

    由于参数被合并到一个映射中,您可以在一个对象中获取所有参数。

    【讨论】:

    • 好的,这可能是原因。但是我可以以某种方式解决它吗?例如,禁用对特定方法的 get-query 参数的解析?
    • 不确定这是否有帮助,但您是否尝试过明确地使用@RequestBody 注释,如:@RequestBody PersonDto p
    猜你喜欢
    • 2011-07-08
    • 2019-05-23
    • 2012-10-24
    • 2018-07-08
    • 1970-01-01
    • 1970-01-01
    • 2016-05-04
    相关资源
    最近更新 更多