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;
}
}
谢谢!
我假设你已经完成了所需的配置,比如在 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;
}
应该修复它。
我试图在 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;
}
}
谢谢!
我假设你已经完成了所需的配置,比如在 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;
}
应该修复它。