我试图在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;
}
}
谢谢!
答案 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"}
亲切的问候