我正在使用JSON对象使用Spring MVC。虽然我想从RESTClient发送JSON对象,但我得到了
HTTP状态400 - 客户端发送的请求在语法上不正确()。
这是我的控制器
ObjectMapper mapper=new ObjectMapper();
@RequestMapping(value = "/addTask", method = RequestMethod.GET)
public ModelAndView addTask(@RequestParam("json") String json) throws JsonParseException, JsonMappingException, IOException
{
System.out.println("Json object from REST : "+json);
Task task=(Task) mapper.readValue(json, Task);
service.addService(task);
return new ModelAndView("Result");
}
我的请求网址:http://localhost:8080/Prime/addTask
我的Json对象:
{“taskName”:“nothing”,“taskId”:1234,“taskDesc”:“什么都没做”}
我也尝试在RESTClient中指定“Content-Type:application / json”但仍然遇到同样的错误
答案 0 :(得分:16)
我最近在请求体中使用JSON字符串遇到了类似的情况,并且使用了与您类似的Spring设置。在我的情况下,我没有指定一个String参数并自行反序列化,但我让Spring这样做:
@RequestMapping(value = "/myService/{id}", method = RequestMethod.POST)
@ResponseBody
public void myService(@PathVariable(value = "id") Long id, @RequestBody MyJsonValueObject request) {
..
}
我收到HTTP错误400“客户端发送的请求在语法上不正确”响应。直到我意识到@RequestBody MyJsonValueObject
上没有默认构造函数,因此反序列化问题。这个问题虽然以这种方式呈现。
因此,如果你正在使用POST和对象,并得到这样的错误,确保你有一个默认的构造函数!添加一些JUnit以确保您可以反序列化该对象。
注意:我不是说这是你收到此错误的唯一原因。原始案例只使用String(它有一个默认的构造函数!)所以它有点不同。但在这两种情况下,似乎请求URI似乎已映射到正确的方法,并且尝试从HTTP请求中提取参数时出现了问题。
答案 1 :(得分:3)
试试这个
更改
@RequestParam("json") String json
要
@RequestBody Task task
如果您对POST方法不感兴趣,可以试试这个
从
更改您的Controller方法@RequestMapping(value = "/addTask", method = RequestMethod.GET)
public ModelAndView addTask(@RequestParam("json") String json)
到
@RequestMapping(value = "/addTask/{taskName}/{taskId}/{taskDesc}", method = RequestMethod.GET)
public ModelAndView addTask(@RequestParam("taskName") String taskName,
@RequestParam("taskId") String taskId,@RequestParam("taskDesc") String taskDesc)
并将您的网址更改为
http://localhost:8080/Prime/addTask/mytask/233/testDesc
答案 2 :(得分:0)
我的问题是由于@RequestBody对象的映射不正确。
我的请求正文看起来像这样
{data: ["1","2","3"]}
我的控制器中有以下代码
@RequestMapping(value = "/mentee", method = RequestMethod.POST)
public @ResponseBody boolean updateData(@RequestBody List<Integer> objDTO, HttpSession session) {
...
}
这给了我HTTP 400,因为Spring不知道如何将我的Json数据绑定到List。
我将RequestBody对象更改为以下
@RequestMapping(value = "/mentee", method = RequestMethod.POST)
public @ResponseBody boolean updateData(@RequestBody ObjectiveDto objDTO, HttpSession session) {
...
}
并将ObjectiveDto定义为
@ToString
public class ObjectiveDto {
@Getter @Setter
private List<Integer> data;
}
这解决了HTTP 400错误。