DTO 只有带有 GET 请求参数的 null,但没有 POST @RequestBody

DTO has only null with GET request params, but not POST @RequestBody

我试图在 DTO like in this question 中获取我的查询参数,但我的 DTO 始终为空值。

我的代码有什么问题吗?我尽量简单了。

查询

GET http://localhost:8080/api/test?a=azaz => 空

POST http://localhost:8080/api/test{"a":"azaz"} => "azaz"

具有 GET 和 POST 的控制器:

@RestController
@RequestMapping(path = {"/api"}, produces = APPLICATION_JSON_VALUE)
public class MyController {

    // GET: dto NOT populated from query params "?a=azaz"
    @RequestMapping(method = GET, path = "test")
    public @ResponseBody String test(TestDto testDto){
        return testDto.toString(); // null
    }

    // POST: dto WELL populated from body json {"a"="azaz"}
    @RequestMapping(method = POST, path = "test")
    public @ResponseBody String postTest(@RequestBody TestDto testDto){
        return testDto.toString(); // "azaz"
    }

}

DTO:

public class TestDto {
    public String a;

    @Override
    public String toString() {
        return a;
    }
}

谢谢!

Full Spring boot sample to illustrate it

我假设你已经完成了所需的配置,比如在 class 路径中使用 Jackson 映射器,在 DTO [中使用 json 属性,getter 和 setter classes等

这里遗漏的一件事是,在 RequestMapping 中使用值属性而不是路径属性,如下所示

    @RequestMapping(method = POST, value= "/test", consumes="application/json")
    public @ResponseBody String postTest(@RequestBody TestDto testDto){
        return testDto.toString(); 
    }

并且,确保在发送请求时设置 content-type="application/json"

我认为你试图做的事情是不可能的。要访问查询参数,您必须使用@RequestParam("a")。然后你就得到了字符串。要以这种方式获取对象,您必须将 json 作为参数传递。 a={"a":"azaz"}

亲切的问候

问题是您缺少该字段的 setter。

 public void setA(String a) {
    this.a = a;
}

应该修复它。