自定义 MessageConverter 在 Spring 引导中不工作
Custom MessageConverter not working in Spring Boot
我想在 Spring 引导中注册一个自定义 MessageConverter
,以便让我更好地控制消息的转换方式。我有一个 Spring Boot 2.1.7 Webflux 应用程序。
我创建了自定义转换器:
public class CustomConverter extends MappingJackson2HttpMessageConverter {
...
}
并将其注册为:
@Bean
public MappingJackson2HttpMessageConverter mappingJackson2HttpMessageConverter(ObjectMapper objectMapper) {
return new CustomConverter();
}
我还确认它是通过自动装配注册的 HttpMessageConverters
并确认它在转换器列表中。
然后我实现了一些我期望被调用的方法,如 canRead
、canWrite
、readInternal
、writeInternal
并在它们上放置断点。
我的应用程序公开了一个以 JSON 响应的 Rest 端点,还调用了一个外部 Rest 服务,该服务 POST 一个 JSON 有效负载并在 return 中接收 JSON。
我在任何时候都看不到我的转换器正在被使用。我什至删除了所有其他转换器,只留下我自己的转换器,但它仍然没有被调用。
我错过了什么吗?
如果您要转换的是 Controller 参数,请使用 @RequestBody
注释来指示 HTTP 请求的 body 被反序列化为特定的 Java 实体。
为了确定合适的转换器,Spring 将使用来自客户端请求的“Content-Type”和"Accept" header。
所以下面的请求将由 JSON 转换器处理(而不是 xml 转换器),因为 "Accept: application/json"
curl --header "Accept: application/json"
http://localhost:8080/spring-boot-rest/foos/1
"Accept" 指定响应可接受的特定媒体类型。
"Content-Type"表示发送到服务器的entity-body的媒体类型。
更多案例见here
在我的 WebFlux 应用程序中,我必须执行以下操作才能使其正常工作:
@Bean
public WebFluxConfigurer webFluxConfigurer(){
return new WebFluxConfigurer() {
@Override
public void configureHttpMessageCodecs(ServerCodecConfigurer configurer) {
configurer.registerDefaults(false);
configurer.customCodecs().encoder(new CustomEncoder());
configurer.customCodecs().decoder(new CustomDecoder());
}
};
}
我想在 Spring 引导中注册一个自定义 MessageConverter
,以便让我更好地控制消息的转换方式。我有一个 Spring Boot 2.1.7 Webflux 应用程序。
我创建了自定义转换器:
public class CustomConverter extends MappingJackson2HttpMessageConverter {
...
}
并将其注册为:
@Bean
public MappingJackson2HttpMessageConverter mappingJackson2HttpMessageConverter(ObjectMapper objectMapper) {
return new CustomConverter();
}
我还确认它是通过自动装配注册的 HttpMessageConverters
并确认它在转换器列表中。
然后我实现了一些我期望被调用的方法,如 canRead
、canWrite
、readInternal
、writeInternal
并在它们上放置断点。
我的应用程序公开了一个以 JSON 响应的 Rest 端点,还调用了一个外部 Rest 服务,该服务 POST 一个 JSON 有效负载并在 return 中接收 JSON。
我在任何时候都看不到我的转换器正在被使用。我什至删除了所有其他转换器,只留下我自己的转换器,但它仍然没有被调用。
我错过了什么吗?
如果您要转换的是 Controller 参数,请使用 @RequestBody
注释来指示 HTTP 请求的 body 被反序列化为特定的 Java 实体。
为了确定合适的转换器,Spring 将使用来自客户端请求的“Content-Type”和"Accept" header。
所以下面的请求将由 JSON 转换器处理(而不是 xml 转换器),因为 "Accept: application/json"
curl --header "Accept: application/json"
http://localhost:8080/spring-boot-rest/foos/1
"Accept" 指定响应可接受的特定媒体类型。 "Content-Type"表示发送到服务器的entity-body的媒体类型。
更多案例见here
在我的 WebFlux 应用程序中,我必须执行以下操作才能使其正常工作:
@Bean
public WebFluxConfigurer webFluxConfigurer(){
return new WebFluxConfigurer() {
@Override
public void configureHttpMessageCodecs(ServerCodecConfigurer configurer) {
configurer.registerDefaults(false);
configurer.customCodecs().encoder(new CustomEncoder());
configurer.customCodecs().decoder(new CustomDecoder());
}
};
}