当前位置: 首页 > 知识库问答 >
问题:

发布时的Spring RestTem板消息转换器优先级

金宣
2023-03-14

什么是最方便的方法来影响消息转换器的优先级Spring应用时发布与RestTem板

用例:我想确保给定的实体被发布为JSON,而不是例如。XML当我做restTemplate.postForEntity(url,实体,Void.class)

违约

选项1

您可以显式地为给定的RestTemboard实例配置消息转换器,如restTemplate.setMessageConverters(Lists.newArrayList(new MappingJackson2HttpMessageConverter())。如果实例是共享的(例如作为Spring bean),这是不方便的,因为您可能需要在一个情况下使用转换器X,在不同的情况下使用转换器Y。

选择2

您可以显式地设置AcceptContent-TypeHTTP头,在这种情况下,Spring将使用匹配的消息转换器。缺点是你必须求助于restemplate。交换而不是rest模板。postForEntity意思是:额外的代码,更少的便利。

HttpHeaders requestHeaders = new HttpHeaders();
requestHeaders.setContentType(MediaType.APPLICATION_JSON);
requestHeaders.setAccept(Collections.singletonList(MediaType.APPLICATION_JSON));
HttpEntity requestEntity = new HttpEntity(entity, requestHeaders);
restTemplate.exchange(url, HttpMethod.POST, requestEntity, Void.class);

选项3

这可能就是我想要的:)


共有2个答案

姬欣怡
2023-03-14

根据Springjavadoc(https://docs.spring.io/spring-framework/docs/current/javadoc-api/index.html?org/springframework/web/client/RestTemplate.html)你仍然可以使用postForEntity,

public <T> ResponseEntity<T> postForEntity(java.lang.String url,
                                       @Nullable
                                       java.lang.Object request,
                                       java.lang.Class<T> responseType,
                                       java.util.Map<java.lang.String,?> uriVariables)
                                throws RestClientException
....

request参数可以是HttpEntity,以便向请求添加额外的HTTP头。

姬烨磊
2023-03-14
匿名用户

这个问题在这里详细回答。

基本上,当您添加下面提到的库时,它会在MappingJackson2HttpMessageConzer之前添加MappingJackson2HttpMessageConzer。因此,Spring Boot假设每个请求都接受应用程序/XML。

 <dependency>
  <groupId>com.fasterxml.jackson.dataformat</groupId>
  <artifactId>jackson-dataformat-xml</artifactId>
</dependency>

为了避免这种行为,您可能需要交换两个消息转换器。

例子:

  @Bean
RestTemplate restTemplate() {
RestTemplate restTemplate = new RestTemplate();
// move XML converter to the end of list
List<HttpMessageConverter<?>> messageConverters = restTemplate.getMessageConverters();
for (int i = 0; i < messageConverters.size() -1 ; i++) {
    if (messageConverters.get(i) instanceof MappingJackson2XmlHttpMessageConverter) {
        Collections.swap(messageConverters, i,messageConverters.size() - 1);
    }
}

restTemplate.setMessageConverters(messageConverters);

// add interceptors if necessary
restTemplate.setInterceptors(Collections.singletonList(catalogInterceptior()));
return restTemplate;

}

 类似资料:
  • Netty中是否有任何嵌入式优先级机制可以帮助我决定哪些消息比其他消息发送得更频繁?

  • 使用MVC Java编程配置方式时,如果你想替换Spring MVC提供的默认转换器,完全定制自己的HttpMessageConverter,这可以通过覆写configureMessageConverters()方法来实现。如果你只是想定制一下,或者想在默认转换器之外再添加其他的转换器,那么可以通过覆写extendMessageConverters()方法来实现。 下面是一段例子,它使用定制的Ob

  • RabbitMQ有消息优先级的概念吗?我有一个问题,一些更重要的消息由于队列中不太重要的消息而被拖慢。我希望高优先级的优先,并移动到队列的前面。 我知道我可以用两个队列来近似计算,一个是“快”队列,另一个是“慢”队列,但这看起来像是一个黑客。 有人知道使用RabbitMQ的更好的解决方案吗?

  • 物联网有很多设备,通过这条指令可以向某个特定的物联网设备发送特定的消息内容。 请求方式: "|4|1|3|topic|message|" 参数: topic 设置订阅的topic,获取设备topic可参考教程 message 发布消息的内容 返回值: "|4|1|3|1|\r" 消息发送成功 "|4|1|3|2|\r" 消息发送失败 Arduino样例: softSerial.print("|4|

  • Spring JMS中的类具有setter方法,它允许提供我们想要的任何转换器。 对于带注释的消息侦听器,这很有意义,因为我们可以直接定义 spring将负责将消息转换并传递给这个侦听器。 因此,这对于带注释的听者来说显然是有意义的。我的问题是,设置消息转换器对非注释消息侦听器有用吗?类似于 从我在docs/javadocs中的搜索和对源代码的有限理解来看,我认为为这种情况设置消息转换器是没有帮助

  • 我们在基于服务的应用程序中使用作为一种事件总线。send方法和消息处理程序基于spring-messaging的类(从Spring-Integration4.0(+)开始)。事件是对实体的更改,需要由其他服务接收。 问题是:spring-messaging类被spring-amqp视为任意对象负载,因为它不被识别为spring-amqp。这会导致以下问题: 默认消息格式是序列化的Java对象。sp