【问题标题】:Missing request param when it is included in body包含在正文中时缺少请求参数
【发布时间】:2020-02-25 03:53:25
【问题描述】:

我在发布 POJO 时收到一条错误消息,指出该字段不包含在内。

资产 POJO

public class Asset {

    private MultipartFile[] files;
    private String name;
    private String meta;

    //Constructor/Getters n Setters
}

资源方法

@PostMapping("asset")
public ResponseEntity uploadAsset(@RequestParam("asset") Asset asset) {
    System.out.println(asset);
    return new ResponseEntity(HttpStatus.ACCEPTED);
}

PostMan JSON 正文

{
    "asset" : {
        "files": [
            "@/home/Downloads/1.jpeg",
            "@/home/Downloads/2.jpeg"   
        ],
        "name": "assetName",
        "meta": "assetMeta"
    }
}

PostMan JSON 响应

{
    "timestamp": "2019-10-29T20:46:19.536+0000",
    "status": 400,
    "error": "Bad Request",
    "message": "Required Asset parameter 'asset' is not present",
    "path": "/asset"
}

我不明白为什么我在 JSON 正文中收到 Required Asset parameter 'asset' is not present 消息。对此有什么想法吗?

【问题讨论】:

  • 请求参数是查询参数../path/otherPath?asset=123...你想要RequestBody

标签: java spring rest file postman


【解决方案1】:

根据您的有效负载,Spring 需要一个如下所示的对象:

public class SomeClass {
    private Asset asset;
}

将您的有效负载更改为如下所示:

{
    "files": [
        "@/home/Downloads/1.jpeg",
        "@/home/Downloads/2.jpeg"   
    ],
    "name": "assetName",
    "meta": "assetMeta"
}

【讨论】:

    【解决方案2】:

    使用@RequestBody 而不是@RequestParam

    public ResponseEntity uploadAsset(@RequestBody Asset asset) {
    

    【讨论】:

    • 所以我将RequestParam 更改为RequestBody,它确实到达了后端,但Asset 对象中的值是空
    • 删除客户端请求中的 asset 封装。正如 Jordan 所示,一切都将映射到资产 @RequestBody 参数中
    【解决方案3】:

    RequestParam

    表示方法参数应该绑定到网络请求参数的注解。

    RequestBody

    指示方法参数的注释应绑定到 Web 请求的正文。请求的主体通过 HttpMessageConverter 传递,以根据请求的内容类型解析方法参数。或者,可以通过使用 @Valid 注释参数来应用自动验证。

    HttpMessageConverter

    策略接口,指定一个转换器,该转换器可以在 HTTP 请求和响应之间进行转换。

    您需要检查转换器的依赖性。因为你使用的是 application/json。

        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-databind</artifactId>
            <version>2.9.8</version>
        </dependency>
    

    Q : 当它包含在正文中时缺少请求参数

    A :使用@RequestBody 注释。

    【讨论】:

      【解决方案4】:

      我尝试了@Jordans 的回答,并调用了端点并将所有值设置为 null :(

      在做更多研究时,我发现了这个声明 https://stackoverflow.com/a/51982230/2199102 并尝试了它。

      结合@Jordans 的回答和注释的变化,我得到了我想要的答案

      【讨论】:

        猜你喜欢
        • 2021-08-10
        • 1970-01-01
        • 1970-01-01
        • 2019-10-21
        • 2012-08-29
        • 1970-01-01
        • 1970-01-01
        • 2018-07-18
        • 2021-11-22
        相关资源
        最近更新 更多