- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我正在研究 Spring 如何处理 REST web 服务,我对 HttpMessageConverter 的概念有一些疑问。
在官方文档上我可以看到:
Strategy interface that specifies a converter that can convert from and to HTTP requests and responses.
所以HttpMessageConverter 似乎是一个接口(interface),但究竟什么是策略接口(interface)?是否与策略模式相关?
据我了解,Spring 在使用 @EnableWebMvc 或
时会自动提供一些默认注册的实现但是这些实现到底是什么?你能给我一个实际的例子吗?
我认为它是这样工作的:
例如,一个客户端执行一个 HttpRequest,在这个请求的主体中放入一个 JSON 消息(我不太实际,但我认为我可以做这样的事情),然后 Controller 处理此 HttpRequst 使用 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 的主体中获取 updatedOrder 输入参数的值,然后将其转换为 Order 使用 HttpMessageConverter 实现的对象。
是正确的还是我遗漏了什么?如果是正确的如何选择正确的转换器?
例如,我在这里找到了另一个与前一个类似的例子: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 转换器。为什么在前面的例子中没有指定?如何选择合适的转换器?
谢谢
最佳答案
处理程序方法参数由 Spring 的 HandlerMethodArgumentResolver
生成,处理程序方法返回值由 Spring 的 HandlerMethodReturnValueHandler
处理。处理@ResponseBody
和@RequestBody
的实现是RequestResponseBodyMethodProcessor
。
其中一个是默认注册的(@EnableWebMvc
配置),默认列表是 HttpMessageConverter
实例。这是在 WebMvcConfigurationSupport#addDefaultHttpMessageConverters(List)
中完成的。您可以找到源代码并查看添加了哪些以及添加的顺序。
当 Spring 为 @RequestBody
参数生成参数时,它循环遍历 HttpMessageConverter
实例,检查该实例是否 HttpMessageConverter#canRead
请求中给出的内容类型,可以生成参数类型的实例。如果可以,Spring 将使用该 HttpMessageConverter
生成一个参数。如果不能,Spring 将跳过它并尝试下一个实例,直到它用完。此时,它会抛出异常。
对于 @ResponseBody
,除了 Spring 现在使用 HttpMessageConverter#canWrite
之外,过程是相同的。它将检查 HttpMessageConverter
是否可以序列化返回类型并生成符合响应中预期内容类型的响应内容(在 Accept
请求 header 中给出)。
@RequestParam
的consumes
属性
@RequestMapping(value = "/pets", method = RequestMethod.POST, consumes="application/json")
与上面声明的策略无关。 consumes
在这里做的唯一一件事是限制处理程序的映射。例如,拿这两个处理程序
@RequestMapping(value = "/pets", method = RequestMethod.POST)
@RequestMapping(value = "/pets", method = RequestMethod.POST, consumes="application/json")
第一个可以处理对任何内容类型的/pets
的任何请求。第二个只能处理内容类型为 application/json
的 /pets
请求。
关于java - @RequestBody 注释究竟是如何工作的以及它与 HttpMessageConverter 接口(interface)有何关系?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29517613/
我正在编写一个客户端来使用 RESTful 服务。我需要以键值对的形式发送请求,他们建议我为此使用 Map。我调用的 RESTful 服务只接受 JSON,我的客户端将使用 Java。它实际上将成为现
我正在尝试获取 ResponseEntity with spring rest 模板,如下所示。我收到以下错误, Caused by: org.springframework.web.client.R
我想创建一个 RuntimeException 并设置 HTTP 状态和文本。有一个创建文本的 textService。 看了很多帖子,还是没明白。 我不能像这样在构造函数中使用 Autowiring
使用 Spring ,使用此代码: List> messageConverters = restTemplate.getMessageConverters(); for(HttpMessageConv
1、HttpMessageConverter 1、ResponseBody 2、RequestEntity 3、@ResponseBody 4、SpringMVC处理json 5、SpringMVC处
我正在运行一个 Spring Boot 应用程序,我已经注册了一个名为 CsvCompactVenueHttpMessageConverter 的新 HttpMessageConverter,这是它的
我有一个 Spring mvc @RestController 类,其中方法参数用 @RequestBody 注释。像这样: @RestController @RequestMapping("/fea
当在入站网关中使用消息转换器发生转换错误时,我遇到了奇怪的行为。下面示例中的想法是接收 XML 有效负载(或序列化 java),将它们转换为 java 对象并使用相同的媒体类型进行响应。 鉴于此配置:
我有一个基于 Spring MVC 的 Rest Web 服务。我用@RestControllerAdvice处理从我的 @Controller 抛出的异常s。 Controller 调用示例如下
读取数据时,Spring HttpMessageConverter 必须如何处理无效的 EOF?也就是说,在这种情况下,Spring MVC 的其余部分如何期望客户转换器发出错误请求信号? 实现读取数
编辑:错误发生在客户端而不是服务器。响应正文正在写入,但客户端未在 400 响应上读取它。 我有一个自定义消息转换器来生成 text/csv , application/csv来自ErrorRespo
我在客户端和服务器上都设置了使用 Jaxb2 的 MarshallingMessageConverter 关注 this问题。 这是在服务器端: @Configuration @EnableWebMv
我正在尝试在 Spring Boot 中解析以下 xml 响应: 响应结构: 来自服务的 API 调用: RestTemplate restTemplate = new RestTem
现在我正在使用 Spring MVC,我遇到并发出一些 Controller 方法没有返回数据并抛出 HttpMediaTypeNotAcceptableException 的问题。我的方法产生了te
我正在编写一个必须调用休息服务的 spring mvc 应用程序(Spring 新手)。我在我的 VM(Linux 中的 weblogic 10.3.6)中部署了其余服务,我正在编写的应用程序在我的本
首先,对于可能的重复,我们深表歉意。我发现了一些关于类似问题的问题。但是,我仍然无法弄清楚我的具体情况出了什么问题。 因此,来自服务器的示例 json: [ { "_id": "55f96
在实现 RESTful API 时,我将所有数据包装在一个对象中,因此它看起来像这样。 {error: null, code: 200, data: {...actual data...}} 这导致我
我正在使用 spring android rest 模板 并尝试将 JSON 响应转换为 java 类,如图所示 here . 这是我尝试完成这项工作的代码 fragment : RestTe
我正在尝试使用 Spring for Android rest client 通过 http post 发送数据,以避免创建和解析 json 数据。 来自他们的 manual他们有以下方法: rest
我正在将 JAXB 对象发布到 REST 服务。生成的类没有 XMLRootElement,因此我使用 Object Factory createXMl 方法创建它。当我手动添加 XMLRootEle
我是一名优秀的程序员,十分优秀!