Spring的HttpMessageConverter如何利用`MediaType.of()`?
时间: 2024-11-05 20:29:35 浏览: 20
Spring框架中的`HttpMessageConverter`是一个关键组件,它负责在HTTP请求和响应之间转换数据,如从HTTP消息转换为Java对象,反之亦然。`MediaType.of()`这个静态工厂方法用于创建`MediaType`对象,这是一种表示媒体类型的工具类,例如文本、JSON、XML等。
当你需要创建特定格式的消息转换器,比如JSON或XML支持的,可以使用`MediaType`的`of()`方法。例如:
```java
MediaType jsonMediaType = MediaType.parseMediaType("application/json");
List<HttpMessageConverter<?>> converters = new ArrayList<>();
converters.add(new MappingJackson2HttpMessageConverter(jsonMediaType));
```
在这里,`MappingJackson2HttpMessageConverter`会被注册到消息转换器链中,使得Spring能够识别并自动处理JSON格式的数据。`MediaType.of()`帮你明确指定了期望的媒体类型,使得系统能够正确解析请求内容或生成响应内容。
相关问题
package com.github.wxiaoqi.security.gate.config; import feign.codec.Decoder; import org.springframework.beans.BeansException; import org.springframework.beans.factory.ObjectFactory; import org.springframework.boot.autoconfigure.http.HttpMessageConverters; import org.springframework.cloud.client.loadbalancer.LoadBalanced; import org.springframework.cloud.openfeign.support.ResponseEntityDecoder; import org.springframework.cloud.openfeign.support.SpringDecoder; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.http.MediaType; import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter; import org.springframework.web.client.RestTemplate; import org.springframework.web.reactive.function.client.WebClient; import java.util.ArrayList; import java.util.List; /** * @author ace * @create 2019/1/27. */ @Configuration public class GatewayConfig { /** * 负载均衡注解 * @return */ @LoadBalanced @Bean public RestTemplate restTemplate() { return new RestTemplate(); } @Bean public Decoder feignDecoder() { return new ResponseEntityDecoder(new SpringDecoder(feignHttpMessageConverter())); } public ObjectFactory<HttpMessageConverters> feignHttpMessageConverter() { final HttpMessageConverters httpMessageConverters = new HttpMessageConverters(new GateWayMappingJackson2HttpMessageConverter()); return new ObjectFactory<HttpMessageConverters>() { @Override public HttpMessageConverters getObject() throws BeansException { return httpMessageConverters; } }; } public class GateWayMappingJackson2HttpMessageConverter extends MappingJackson2HttpMessageConverter { GateWayMappingJackson2HttpMessageConverter(){ List<MediaType> mediaTypes = new ArrayList<>(); mediaTypes.add(MediaType.valueOf(MediaType.TEXT_HTML_VALUE + ";charset=UTF-8")); setSupportedMediaTypes(mediaTypes); } } @Bean @LoadBalanced public WebClient.Builder loadBalancedWebClientBuilder() { return WebClient.builder(); } }
这是一个 Spring Cloud Gateway 的配置类,其中包含了一些 Bean 的定义,例如负载均衡的 RestTemplate 和 WebClient.Builder。此外,还定义了一个 GateWayMappingJackson2HttpMessageConverter 类,用于处理响应报文的转换。同时,该类还使用了 Feign 的 Decoder 进行响应解码。
在Spring中如何正确使用`MediaType.of()`?
在Spring框架中,`MediaType.of()`是一个静态方法,通常用于Spring的HttpMessageConverter组件中,用来创建自定义的MediaType对象。例如,如果你想表示一个JSON响应,你可以这样做:
```java
import org.springframework.http.MediaType;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class MyController {
@GetMapping("/api/response")
public ResponseEntity<String> getResponse() {
MediaType customMediaType = MediaType.parseMediaType("application/vnd.mycompany+json");
return ResponseEntity.ok().contentType(customMediaType).body("Your custom JSON response");
}
}
```
在这个例子中,`MediaType.of()`不是直接使用的,而是通过`parseMediaType()`方法间接调用。`MediaType.of()`通常是在配置MessageConverters时,作为构造函数参数传递给像`MappingJackson2HttpMessageConverter`这样的转换器,以便它们知道如何处理特定的请求内容类型。
阅读全文