@Override public String toString() { return "CompositeMessageConverter[converters=" + getConverters() + "]"; }
@Bean public CompositeMessageConverter brokerMessageConverter() { List<MessageConverter> converters = new ArrayList<>(); boolean registerDefaults = configureMessageConverters(converters); if (registerDefaults) { converters.add(new StringMessageConverter()); converters.add(new ByteArrayMessageConverter()); if (jackson2Present) { converters.add(createJacksonConverter()); } } return new CompositeMessageConverter(converters); }
private void produceMessage(Message<?> message, SimpMessageHeaderAccessor headerAccessor) { headerAccessor.removeHeader(SimpMessageHeaderAccessor.NATIVE_HEADERS); Object payload = this.messageConverter.fromMessage(message, this.payloadType.get()); Assert.state(payload != null, () -> "The message converter '" + this.messageConverter + "' produced no payload for message '" + message + "' and expected payload type: " + this.payloadType.get()); Message<Object> messageToSend = getMessageBuilderFactory() .withPayload(payload) .copyHeaders(headerAccessor.toMap()) .build(); sendMessage(messageToSend); }
Object payload = message.getPayload(); Message<?> messageToSend = this.messageConverter.toMessage(payload, headers.getMessageHeaders()); Assert.state(messageToSend != null, () -> "The message converter '" + this.messageConverter +
@SuppressWarnings("unchecked") private <T> T resolveArgument(Message<I> message) { if (logger.isDebugEnabled()) { logger.debug("Resolving input argument from message: " + message); } T argument = (T) (shouldConvertFromMessage(message) ? this.messageConverter.fromMessage(message, this.inputClass) : message); Assert.notNull(argument, "Failed to resolve argument type '" + this.inputClass + "' from message: " + message ); if (!this.isInputArgumentMessage && argument instanceof Message) { argument = ((Message<T>)argument).getPayload(); } return argument; }
@SuppressWarnings("unchecked") private <T> Message<O> toMessage(T value, Message<I> originalMessage) { if (logger.isDebugEnabled()) { logger.debug("Converting result back to message using the original message: " + originalMessage); } Message<O> returnMessage; if(producerProperties.isUseNativeEncoding()){ if (logger.isDebugEnabled()) { logger.debug("Native encoding enabled wrapping result to message using the original message: " + originalMessage); } returnMessage = wrapOutputToMessage(value,originalMessage); } else { returnMessage = (Message<O>) (value instanceof Message ? value : this.messageConverter.toMessage(value, originalMessage.getHeaders(), this.outputClass)); if (returnMessage == null && value.getClass().isAssignableFrom(this.outputClass)) { returnMessage = wrapOutputToMessage(value, originalMessage); } else if (this.bindingServiceProperties != null && this.bindingServiceProperties.getBindingProperties(this.functionProperties.getOutputDestinationName()) != null && !returnMessage.getHeaders().containsKey(MessageHeaders.CONTENT_TYPE)) { ((Map<String, Object>) ReflectionUtils.getField(MESSAGE_HEADERS_FIELD, returnMessage.getHeaders())) .put(MessageHeaders.CONTENT_TYPE, MimeType.valueOf(bindingServiceProperties.getBindingProperties("output").getContentType())); } Assert.notNull(returnMessage, "Failed to convert result value '" + value + "' to message."); } return returnMessage; }
@Override @Nullable public Object fromMessage(Message<?> message, Class<?> targetClass) { for (MessageConverter converter : getConverters()) { Object result = converter.fromMessage(message, targetClass); if (result != null) { return result; } } return null; }
/** * Create an instance of SimpAnnotationMethodMessageHandler with the given * message channels and broker messaging template. * @param clientInboundChannel the channel for receiving messages from clients (e.g. WebSocket clients) * @param clientOutboundChannel the channel for messages to clients (e.g. WebSocket clients) * @param brokerTemplate a messaging template to send application messages to the broker */ public SimpAnnotationMethodMessageHandler(SubscribableChannel clientInboundChannel, MessageChannel clientOutboundChannel, SimpMessageSendingOperations brokerTemplate) { Assert.notNull(clientInboundChannel, "clientInboundChannel must not be null"); Assert.notNull(clientOutboundChannel, "clientOutboundChannel must not be null"); Assert.notNull(brokerTemplate, "brokerTemplate must not be null"); this.clientInboundChannel = clientInboundChannel; this.clientMessagingTemplate = new SimpMessagingTemplate(clientOutboundChannel); this.brokerTemplate = brokerTemplate; Collection<MessageConverter> converters = new ArrayList<>(); converters.add(new StringMessageConverter()); converters.add(new ByteArrayMessageConverter()); this.messageConverter = new CompositeMessageConverter(converters); }
private void produceMessage(Message<?> message, SimpMessageHeaderAccessor headerAccessor) { headerAccessor.removeHeader(SimpMessageHeaderAccessor.NATIVE_HEADERS); Object payload = this.messageConverter.fromMessage(message, this.payloadType.get()); Assert.state(payload != null, () -> "The message converter '" + this.messageConverter + "' produced no payload for message '" + message + "' and expected payload type: " + this.payloadType.get()); Message<Object> messageToSend = getMessageBuilderFactory() .withPayload(payload) .copyHeaders(headerAccessor.toMap()) .build(); sendMessage(messageToSend); }
Object payload = message.getPayload(); Message<?> messageToSend = this.messageConverter.toMessage(payload, headers.getMessageHeaders()); Assert.state(messageToSend != null, () -> "The message converter '" + this.messageConverter +
@Override @Nullable public Message<?> toMessage(Object payload, @Nullable MessageHeaders headers) { for (MessageConverter converter : getConverters()) { Message<?> result = converter.toMessage(payload, headers); if (result != null) { return result; } } return null; }
@Test(expected = MessageConversionException.class) public void convertAndSendNoMatchingConverter() { MessageConverter converter = new CompositeMessageConverter( Arrays.<MessageConverter>asList(new MappingJackson2MessageConverter())); this.template.setMessageConverter(converter); this.headers.put(MessageHeaders.CONTENT_TYPE, MimeTypeUtils.APPLICATION_XML); this.template.convertAndSend("home", "payload", new MessageHeaders(this.headers)); }
this.messageConverter.fromMessage(message, payloadTypeParameterClass), message.getHeaders())); emitter.next(this.messageConverter.fromMessage(message, fluxTypeParameterClass));
@Override @Nullable public Message<?> toMessage(Object payload, @Nullable MessageHeaders headers, @Nullable Object conversionHint) { for (MessageConverter converter : getConverters()) { Message<?> result = (converter instanceof SmartMessageConverter ? ((SmartMessageConverter) converter).toMessage(payload, headers, conversionHint) : converter.toMessage(payload, headers)); if (result != null) { return result; } } return null; }
@Bean public CompositeMessageConverter brokerMessageConverter() { List<MessageConverter> converters = new ArrayList<>(); boolean registerDefaults = configureMessageConverters(converters); if (registerDefaults) { converters.add(new StringMessageConverter()); converters.add(new ByteArrayMessageConverter()); if (jackson2Present) { converters.add(createJacksonConverter()); } } return new CompositeMessageConverter(converters); }
@Override @Nullable public Object fromMessage(Message<?> message, Class<?> targetClass, @Nullable Object conversionHint) { for (MessageConverter converter : getConverters()) { Object result = (converter instanceof SmartMessageConverter ? ((SmartMessageConverter) converter).fromMessage(message, targetClass, conversionHint) : converter.fromMessage(message, targetClass)); if (result != null) { return result; } } return null; }
/** * Create an instance of SimpAnnotationMethodMessageHandler with the given * message channels and broker messaging template. * @param clientInboundChannel the channel for receiving messages from clients (e.g. WebSocket clients) * @param clientOutboundChannel the channel for messages to clients (e.g. WebSocket clients) * @param brokerTemplate a messaging template to send application messages to the broker */ public SimpAnnotationMethodMessageHandler(SubscribableChannel clientInboundChannel, MessageChannel clientOutboundChannel, SimpMessageSendingOperations brokerTemplate) { Assert.notNull(clientInboundChannel, "clientInboundChannel must not be null"); Assert.notNull(clientOutboundChannel, "clientOutboundChannel must not be null"); Assert.notNull(brokerTemplate, "brokerTemplate must not be null"); this.clientInboundChannel = clientInboundChannel; this.clientMessagingTemplate = new SimpMessagingTemplate(clientOutboundChannel); this.brokerTemplate = brokerTemplate; Collection<MessageConverter> converters = new ArrayList<>(); converters.add(new StringMessageConverter()); converters.add(new ByteArrayMessageConverter()); this.messageConverter = new CompositeMessageConverter(converters); }
@Test public void configureMessageConvertersCustom() { final MessageConverter testConverter = mock(MessageConverter.class); AbstractMessageBrokerConfiguration config = new BaseTestMessageBrokerConfig() { @Override protected boolean configureMessageConverters(List<MessageConverter> messageConverters) { messageConverters.add(testConverter); return false; } }; CompositeMessageConverter compositeConverter = config.brokerMessageConverter(); assertThat(compositeConverter.getConverters().size(), Matchers.is(1)); Iterator<MessageConverter> iterator = compositeConverter.getConverters().iterator(); assertThat(iterator.next(), Matchers.is(testConverter)); }
public CompositeMessageConverter getMessageConverterForAllRegistered() { return new CompositeMessageConverter(new ArrayList<>(this.converters)); }
@Test public void messageConvertersDefaultsOff() { loadBeanDefinitions("websocket-config-broker-converters-defaults-off.xml"); CompositeMessageConverter compositeConverter = this.appContext.getBean(CompositeMessageConverter.class); assertNotNull(compositeConverter); assertEquals(1, compositeConverter.getConverters().size()); assertEquals(StringMessageConverter.class, compositeConverter.getConverters().iterator().next().getClass()); }