assertThat(mapped.getMessageProperties().getContentType(), equalTo("my/ct")); ContentTypeDelegatingMessageConverter ctdConverter = new ContentTypeDelegatingMessageConverter(); ctdConverter.addDelegate("my/ct", converter); mapped = MappingUtils.mapMessage(requestMessage, ctdConverter, headerMapper, defaultDeliveryMode, headersMappedLast);
@Override public Message toMessage(Object object, MessageProperties messageProperties) { String contentType = messageProperties.getContentType(); return getConverterForContentType(contentType).toMessage(object, messageProperties); }
protected MessageConverter getConverterForContentType(String contentType) { MessageConverter delegate = getDelegates().get(contentType); if (delegate == null) { delegate = this.defaultConverter; } if (delegate == null) { throw new MessageConversionException("No delegate converter is specified for content type " + contentType); } else { return delegate; } }
@Test public void testDelegationOutbound() { ContentTypeDelegatingMessageConverter converter = new ContentTypeDelegatingMessageConverter(); Jackson2JsonMessageConverter messageConverter = new Jackson2JsonMessageConverter(ContentTypeDelegatingMessageConverterTests.class.getPackage().getName()); converter.addDelegate("foo/bar", messageConverter); converter.addDelegate(MessageProperties.CONTENT_TYPE_JSON, messageConverter); MessageProperties props = new MessageProperties(); Foo foo = new Foo(); foo.setFoo("bar"); Message message = converter.toMessage(foo, props); assertEquals(MessageProperties.CONTENT_TYPE_SERIALIZED_OBJECT, message.getMessageProperties().getContentType()); Object converted = converter.fromMessage(message); assertThat(converted, instanceOf(Foo.class)); props.setContentType("foo/bar"); message = converter.toMessage(foo, props); assertEquals(MessageProperties.CONTENT_TYPE_JSON, message.getMessageProperties().getContentType()); assertEquals("{\"foo\":\"bar\"}", new String(message.getBody())); converted = converter.fromMessage(message); assertThat(converted, instanceOf(Foo.class)); converter = new ContentTypeDelegatingMessageConverter(null); // no default try { converter.toMessage(foo, props); fail("Expected exception"); } catch (Exception e) { assertThat(e, instanceOf(MessageConversionException.class)); assertThat(e.getMessage(), containsString("No delegate converter")); } }
@Override public Object fromMessage(Message message) throws MessageConversionException { String contentType = message.getMessageProperties().getContentType(); return getConverterForContentType(contentType).fromMessage(message); }