如果我发送这样的数据:
$.ajax({
url: $fooForm.action,
data: $fooForm.serialize(),
type: 'POST',
success: function(data) { console.log(data); }
});
这可以由具有以下签名的控制器接收:
public ResponseEntity<Map<String, Object>> checkEligibility( Person person )
在另一个例子中,我发送的请求是这样的:
$.ajax({
url: $fooForm.action,
data: $fooForm.serialize(),
dataType: 'json',
type: 'POST',
success: function(data) { console.log(data); }
});
这可以由具有以下签名的控制器接收:
public ResponseEntity<Map<String, Object>> checkEligibility(@RequestBody Person person )
我想编写一个可以同时接受json POST和简单POST的方法,并给我相同的Person对象
答案 0 :(得分:1)
如果x-www-form-urlencoded POST是基于浏览器的HTML表单应用程序的一部分,请不要这样做
您应该使用带有HTML表单的POST-Redirect-GET模式。否则,当用户在他们的浏览器中点击刷新时,他们会得到令人讨厌的弹出窗口。
这基本上与REST API的模式不一致
答案 1 :(得分:0)
您可以使用多态来使此功能正常工作。
因此,您需要创建一个BaseController。
@Controller
public class BaseController
public ResponseEntity<Map<String, Object>> checkEligibility(final Person person) {
Map<String, Object> body = new HashMap<String, Object>();
body.put("person", person);
ResponseEntity<Map<String, Object>> entity = new ResponseEntity<Map<String,Object>>(body, HttpStatus.OK);
// write some logic here ...
return entity;
}
接下来,您需要创建RestController
@Controller
@RequestMapping(value = "/eligibility")
public class RestController extends BaseController {
@Override
@ResponseBody
@RequestMapping(method = RequestMethod.POST, headers = { "content-type=application/json" })
public ResponseEntity<Map<String, Object>> checkEligibility(final @RequestBody Person person) {
return super.checkEligibility(person);
}
}
之后,创建Standart控制器
@Controller
@RequestMapping(value = "/eligibility")
public class StandartController extends BaseController {
@Override
@ResponseBody
@RequestMapping(method = RequestMethod.POST)
public ResponseEntity<Map<String, Object>> checkEligibility(final @ModelAttribute Person person) {
return super.checkEligibility(person);
}
}
现在这应该有效。