1

我正在试验 Spring 4 WebSocket STOMP 应用程序。有没有办法明确指定处理程序产生的返回消息的内容类型?默认情况下,下面的处理application/json程序由相应的消息转换器生成和处理。

@Controller
public class ProductController {

    @MessageMapping("/products/{id}")
    public String getProduct(@DestinationVariable int id) {
        return getProductById(id);
    }

}

我正在寻找类似@RequestMapping(produces = "text/xml")Spring MVC 的东西。

更新(回复罗森的回答):

理想情况下,我希望能够根据用户的要求返回两种格式。但如果我必须选择,我会说 XML 而几乎从不说 JSON(XML 只是一个例子,我们使用二进制格式)。我采用了您建议的第二种方式 - 配置自定义转换器而不是默认转换器。

  1. 我已经实现了自定义MessageConverter扩展AbstractMessageConverter。在构造函数中,我注册了适当的受支持的 MimeType。
  2. 然后我通过覆盖WebSocketMessageBrokerConfigurer's注册了我的自定义转换器configureMessageConverters,并false从该方法返回以不添加默认转换器。
  3. 一旦我的控制器返回值,我就会在SendToMethodReturnValueHandler's中获得 NPE postProcessMessage。发生这种情况是因为CompositeMessageConverter仅包含一个转换器 - 我的自定义转换器。但我的转换器未能AbstractMessageConverter通过supportsMimeType检查并返回。这会导致.AbstractMessageConvertertoMessagenullnullpostProcessMessage

作为解决方法,我可以application/json为我的自定义转换器注册额外的默认 MimeType。但它看起来对我来说太脏了。

4

2 回答 2

0

没有什么像生产条件一样。现在唯一的方法是注入SimpMessagingTemplate然后使用 convertAndSend 方法变体,它需要一个MessagePostProcessor. 它可以变得更简单。你的用例是什么?您是否主要使用 JSON 并且需要在少数地方使用 XML?还是您需要主要使用 XML?如果是后者,您可以简单地配置要使用的转换器而不是默认转换器。

于 2014-01-28T18:59:26.817 回答
0

我看到您可以更改标题以更改消息转换器。例如:

SockJsClient sockJsClient = new SockJsClient(transports);
WebSocketStompClient stompClient = new WebSocketStompClient(sockJsClient);
..
stompClient.setMessageConverter(new StringMessageConverter());
or
stompClient.setMessageConverter(new SimpleMessageConverter());

当您使用 StringMessageConverter 时,Java 客户端会添加一个内容类型标头。

GenericMessage [payload=byte[33], headers={simpMessageType=MESSAGE, stompCommand=SEND, nativeHeaders={destination=[/app/chatchannel], content-type=[text/plain;charset=UTF-8], content-length=[33]}, simpSessionAttributes={ip=/127.0.0.1:59629}, simpHeartbeat=[J@147a2bf, contentType=text/plain;charset=UTF-8, lookupDestination=/chatchannel, simpSessionId=79431feb8b5f4a9497492ccc64f8965f, simpDestination=/app/chatchannel}]

但是如果您使用 SimpleMessageConverter,则不会添加内容类型标头。

这是关于你想要做什么的线索?

检查这个问题,我放了一些可以帮助你的代码:

如何配置 Spring Sockjs Java Client 消息转换器

于 2016-08-18T19:06:08.463 回答