DTO只有null和GET请求参数,但不是POST @RequestBody

时间:2016-09-16 15:44:16

标签: spring spring-mvc dto http-request-parameters

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

我的代码有什么问题吗?我尽可能简单。

查询

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

POST http://localhost:8080/api/test {"a":"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

3 个答案:

答案 0 :(得分:1)

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

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

应该修复它。

答案 1 :(得分:0)

我假设您已完成所需的配置,例如在类路径中使用Jackson映射器,在DTO类中使用json属性,getter和setter等。

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

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

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

答案 2 :(得分:0)

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

亲切的问候