Spring RestController 中的 RequestMapping returns 406
Spring RequestMapping in RestController returns 406
在 @RestController
我有一个 @RequestMapping
可以工作,除了我在尝试 return POJO class ResponseVO
[= 时在客户端中得到 406 18=]
@RequestMapping(value = "path", method = RequestMethod.POST
, produces = MediaType.APPLICATION_JSON_VALUE)
public @ResponseBody ResponseEntity<GenericResponse> path(
...
ResponseVO responseVO = new responseVO();
return new ResponseEntity<>(responseVO, HttpStatus.OK);
我发送 POST 和 JSON body,我的请求 headers:
Connection: keep-alive
Content-Type: application/json
Accept: */*
Content-Length: 58
Host: localhost:8080
User-Agent: Apache-HttpClient/4.5.6 (Java/1.8.0_151)
响应headers:
HTTP/1.1 406 Not Acceptable
Server: Apache-Coyote/1.1
Access-Control-Allow-Origin: *
Access-Control-Allow-Credentials: true
Access-Control-Allow-Methods: POST, GET, PUT, OPTIONS, DELETE
Access-Control-Max-Age: 3600
Access-Control-Allow-Headers: X-Requested-With, Content-Type, Authorization, Origin, Accept, Access-Control-Request-Method, Access-Control-Request-Headers
Content-Type: text/html;charset=utf-8
Content-Language: en
Content-Length: 1067
首先,从方法中删除 @ResponseBody
注释,因为它已经包含在 @RestController
注释中。同时从 @RequestMapping
中删除 produces
属性并检查问题是否消失。
当您使用 @RestController
时,它自动意味着您在 spring 引导中注释 @Controller
和 @ResponseBody
。所以你不需要明确地在你的方法上添加 @ResponseBody
注释。 @ResponseBody
注释也在方法上方添加,而不是方法声明。因此,即使您正确添加了此注释,您的代码也应该可以正常工作。往下看
@RequestMapping(value = "path", method = RequestMethod.POST, produces =MediaType.APPLICATION_JSON_VALUE)
@ResponseBody
public ResponseEntity<GenericResponse> path(
...
ResponseVO responseVO = new responseVO();
return new ResponseEntity<>(responseVO, HttpStatus.OK);
您没有在 @RequestMapping
中设置 consumes
属性。
但您可以使用 @PostMapping
代替 JSON,默认情况下将设置所有值。
就@PostMapping("path")
在 @RestController
我有一个 @RequestMapping
可以工作,除了我在尝试 return POJO class ResponseVO
[= 时在客户端中得到 406 18=]
@RequestMapping(value = "path", method = RequestMethod.POST
, produces = MediaType.APPLICATION_JSON_VALUE)
public @ResponseBody ResponseEntity<GenericResponse> path(
...
ResponseVO responseVO = new responseVO();
return new ResponseEntity<>(responseVO, HttpStatus.OK);
我发送 POST 和 JSON body,我的请求 headers:
Connection: keep-alive
Content-Type: application/json
Accept: */*
Content-Length: 58
Host: localhost:8080
User-Agent: Apache-HttpClient/4.5.6 (Java/1.8.0_151)
响应headers:
HTTP/1.1 406 Not Acceptable
Server: Apache-Coyote/1.1
Access-Control-Allow-Origin: *
Access-Control-Allow-Credentials: true
Access-Control-Allow-Methods: POST, GET, PUT, OPTIONS, DELETE
Access-Control-Max-Age: 3600
Access-Control-Allow-Headers: X-Requested-With, Content-Type, Authorization, Origin, Accept, Access-Control-Request-Method, Access-Control-Request-Headers
Content-Type: text/html;charset=utf-8
Content-Language: en
Content-Length: 1067
首先,从方法中删除 @ResponseBody
注释,因为它已经包含在 @RestController
注释中。同时从 @RequestMapping
中删除 produces
属性并检查问题是否消失。
当您使用 @RestController
时,它自动意味着您在 spring 引导中注释 @Controller
和 @ResponseBody
。所以你不需要明确地在你的方法上添加 @ResponseBody
注释。 @ResponseBody
注释也在方法上方添加,而不是方法声明。因此,即使您正确添加了此注释,您的代码也应该可以正常工作。往下看
@RequestMapping(value = "path", method = RequestMethod.POST, produces =MediaType.APPLICATION_JSON_VALUE)
@ResponseBody
public ResponseEntity<GenericResponse> path(
...
ResponseVO responseVO = new responseVO();
return new ResponseEntity<>(responseVO, HttpStatus.OK);
您没有在 @RequestMapping
中设置 consumes
属性。
但您可以使用 @PostMapping
代替 JSON,默认情况下将设置所有值。
就@PostMapping("path")