我正在学习Spring如何处理REST web服务,并且我对HttpMessageConverter的概念有一些疑问。
在官方文档中,我可以看到:
策略接口,指定一个转换器,可以将HTTP请求和响应进行转换。
因此,HttpMessageConverter似乎是一个接口,但是什么是策略接口?与策略模式相关还是不相关?
所以,从我的理解来看,当使用@EnableWebMvc或时,Spring会自动提供一些默认注册的实现。
但是,这些实现到底是做什么的?能否提供一个实际的例子?
我认为它的工作方式如下:
例如,客户端执行一个HttpRequest,在该请求的主体中放置一个JSON消息(我不太熟练,但我认为我可以做类似于这样的事情),然后处理这个HttpRequest的控制器使用HttpMessageConverter的实现将此JSON消息转换为模型对象。我认为反之亦然。
我的思路正确吗?还是我漏了什么?
另一个疑问与@RequestBody注解有关(我认为它与前面的主题有关)。
我有这个例子:
@RequestMapping(value="/orders/{id}", method=RequestMethod.PUT)
@ResponseStatus(HttpStatus.NO_CONTENT) // 204
public void updateOrder(@RequestBody Order updatedOrder, @PathVariable("id") long id) {
// process updated order data and return empty response
orderManager.updateOrder(id, updatedOrder);
}
因此,我认为@RequestBody Order updatedOrder会从HttpRequest的body中获取updatedOrder输入参数的值,然后使用HttpMessageConverter的实现将其转换为一个Order对象。这是正确的吗?如果正确,如何选择正确的转换器?
例如,在这里我找到了另一个类似于之前的示例:http://docs.spring.io/spring/docs/current/spring-framework-reference/html/mvc.html
@Controller
@RequestMapping(value = "/pets", method = RequestMethod.POST, consumes="application/json")
public void addPet(@RequestBody Pet pet, Model model) {
// implementation omitted
}
我认为这里明确指定必须使用JSON转换成MODEL OBJECT。为什么在先前的例子中没有说明呢?如何选择正确的转换器?
谢谢
HttpMessageConverter
实现。对于 JSON,它可能使用依赖于 Jackson 库的实现(以及它的工作方式)。 - Sotirios Delimanolis