如何将json和表单提交请求映射到同一个控制器?

时间:2014-12-03 12:03:05

标签: spring spring-mvc

如果我发送这样的数据:

 $.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对象

2 个答案:

答案 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);
    }

}

现在这应该有效。