首页 > 解决方案 > PostMapping 无法识别 RequestBody

问题描述

所以我的问题如下。我在控制器中实现了一个新端点,如下所示:

@PostMapping("{inventoryNumber}/status")
public UpdateStatusResponse updateDeviceStatus(@PathVariable String inventoryNumber, @RequestBody UpdateStatusRequest updateStatusRequest)
    {
        return deviceService.updateStatus(inventoryNumber, updateStatusRequest);
    }

那是端点中我的控制器类的标题:

@RestController
@RequestMapping("/api/devices/")
public class DeviceController {

    private final DeviceService deviceService;

这是 UpdateStatusRequest,它还有 getter、setter、equals 和 hashcode 方法。

public class UpdateStatusRequest {

    @JsonProperty("status")
    private String status;

    public UpdateStatusRequest(String status)
    {
        this.status = status;
    }

我尝试使用适当的邮递员请求和 json 正文(不幸的是我还不能上传图片)来测试我的方法,但我的正文看起来像这样:

{
   "status": "NEWCONFIG"
}

但我每次都会收到一个 400 错误请求。我已经发现,它不识别 Body,所以它不运行方法。当我移除身体时,它会起作用。当我将第二个属性放入 UpdateStatusRequest(和邮递员请求)时,它也可以工作。您知道为什么它不起作用并为我提供解决方案吗?(更可取的是一个解决方案,它适用于@RequestBody 而不是@RequestParam)

标签: javajsonspringspring-boot

解决方案


什么是发布请求正文格式?你用杰克逊来序列化身体吗?通常Bad-Request当杰克逊无法序列化正文时会给出响应。

编辑:您可能必须添加implements Serializable有效负载类。

您可以测试序列化本身并查看您得到的序列化错误。这是JSON格式的序列化测试示例

    @Test
    public void serializeTest() throws IOException {
        String jsonString = 
                "{" +
                   "\"myKey\" : 11" +
                "}";
        ObjectMapper mapper = new ObjectMapper();
        MyClass object = mapper.reader().forType(MyClass.class).readValue(jsonString);

        System.out.println(object);
    }

推荐阅读