From 7c529336a9751ddc8a85ad47bed6dc2b7e4c9101 Mon Sep 17 00:00:00 2001 From: Oleg Zhurakousky Date: Wed, 21 Nov 2018 19:26:26 +0100 Subject: [PATCH] GH-1533 Fixed regression in ObjectStringMessageConverter Resolves #1533 --- .../ObjectStringMessageConverter.java | 4 +- .../binder/tck/ContentTypeTckTests.java | 72 +++++++++++++++++++ 2 files changed, 74 insertions(+), 2 deletions(-) diff --git a/spring-cloud-stream/src/main/java/org/springframework/cloud/stream/converter/ObjectStringMessageConverter.java b/spring-cloud-stream/src/main/java/org/springframework/cloud/stream/converter/ObjectStringMessageConverter.java index f70445e31..fdee12a8e 100644 --- a/spring-cloud-stream/src/main/java/org/springframework/cloud/stream/converter/ObjectStringMessageConverter.java +++ b/spring-cloud-stream/src/main/java/org/springframework/cloud/stream/converter/ObjectStringMessageConverter.java @@ -57,7 +57,7 @@ public class ObjectStringMessageConverter extends AbstractMessageConverter { @Override protected boolean supportsMimeType(@Nullable MessageHeaders headers) { MimeType mimeType = getMimeType(headers); - if (mimeType != null && !super.supportsMimeType(headers)) { + if (mimeType != null) { for (MimeType current : getSupportedMimeTypes()) { if (current.getType().equals(mimeType.getType())) { return true; @@ -65,7 +65,7 @@ public class ObjectStringMessageConverter extends AbstractMessageConverter { } } - return false; + return super.supportsMimeType(headers); } protected Object convertFromInternal(Message message, Class targetClass, Object conversionHint) { diff --git a/spring-cloud-stream/src/test/java/org/springframework/cloud/stream/binder/tck/ContentTypeTckTests.java b/spring-cloud-stream/src/test/java/org/springframework/cloud/stream/binder/tck/ContentTypeTckTests.java index 704fb8f34..91095f385 100644 --- a/spring-cloud-stream/src/test/java/org/springframework/cloud/stream/binder/tck/ContentTypeTckTests.java +++ b/spring-cloud-stream/src/test/java/org/springframework/cloud/stream/binder/tck/ContentTypeTckTests.java @@ -232,6 +232,52 @@ public class ContentTypeTckTests { assertEquals(jsonPayload, new String(outputMessage.getPayload(), StandardCharsets.UTF_8)); } + @Test + public void typelessToPojoWithTextHeaderContentTypeBinding() { + ApplicationContext context = new SpringApplicationBuilder(TypelessToPojoStreamListener.class) + .web(WebApplicationType.NONE) + .run("--spring.jmx.enabled=false"); + InputDestination source = context.getBean(InputDestination.class); + OutputDestination target = context.getBean(OutputDestination.class); + String jsonPayload = "{\"name\":\"oleg\"}"; + source.send(MessageBuilder.withPayload(jsonPayload.getBytes()).setHeader(MessageHeaders.CONTENT_TYPE, MimeType.valueOf("text/plain")).build()); + Message outputMessage = target.receive(); + assertEquals(MimeTypeUtils.APPLICATION_JSON, outputMessage.getHeaders().get(MessageHeaders.CONTENT_TYPE)); + assertEquals(jsonPayload, new String(outputMessage.getPayload(), StandardCharsets.UTF_8)); + } + + @Test + public void typelessToPojoOutboundContentTypeBinding() { + ApplicationContext context = new SpringApplicationBuilder(TypelessToMessageStreamListener.class) + .web(WebApplicationType.NONE) + .run("--spring.cloud.stream.bindings.output.contentType=text/plain", "--spring.jmx.enabled=false"); + InputDestination source = context.getBean(InputDestination.class); + OutputDestination target = context.getBean(OutputDestination.class); + String jsonPayload = "{\"name\":\"oleg\"}"; + //source.send(MessageBuilder.withPayload(jsonPayload.getBytes()).setHeader(MessageHeaders.CONTENT_TYPE, MimeType.valueOf("text/*")).build()); + source.send(MessageBuilder.withPayload(jsonPayload.getBytes()).setHeader("contentType", new MimeType("text", "plain")).build()); + + Message outputMessage = target.receive(); + //assertEquals(MimeTypeUtils.APPLICATION_JSON, outputMessage.getHeaders().get(MessageHeaders.CONTENT_TYPE)); + assertEquals(jsonPayload, new String(outputMessage.getPayload(), StandardCharsets.UTF_8)); + } + + @Test + public void outboundMessageWithTextContentTypeOnly() { + ApplicationContext context = new SpringApplicationBuilder(TypelessToMessageTextOnlyContentTypeStreamListener.class) + .web(WebApplicationType.NONE) + .run("--spring.jmx.enabled=false"); + InputDestination source = context.getBean(InputDestination.class); + OutputDestination target = context.getBean(OutputDestination.class); + String jsonPayload = "{\"name\":\"oleg\"}"; + //source.send(MessageBuilder.withPayload(jsonPayload.getBytes()).setHeader(MessageHeaders.CONTENT_TYPE, MimeType.valueOf("text/*")).build()); + source.send(MessageBuilder.withPayload(jsonPayload.getBytes()).setHeader("contentType", new MimeType("text")).build()); + + Message outputMessage = target.receive(); + //assertEquals(MimeTypeUtils.APPLICATION_JSON, outputMessage.getHeaders().get(MessageHeaders.CONTENT_TYPE)); + assertEquals(jsonPayload, new String(outputMessage.getPayload(), StandardCharsets.UTF_8)); + } + @Test @@ -566,6 +612,32 @@ public class ContentTypeTckTests { @EnableBinding(Processor.class) @Import(TestChannelBinderConfiguration.class) +<<<<<<< HEAD +======= + @EnableAutoConfiguration + public static class TypelessToMessageStreamListener { + @StreamListener(Processor.INPUT) + @SendTo(Processor.OUTPUT) + public Message echo(Object value) throws Exception { + return MessageBuilder.withPayload(value.toString()).setHeader("contentType", new MimeType("text", "plain")).build(); + } + } + + @EnableBinding(Processor.class) + @Import(TestChannelBinderConfiguration.class) + @EnableAutoConfiguration + public static class TypelessToMessageTextOnlyContentTypeStreamListener { + @StreamListener(Processor.INPUT) + @SendTo(Processor.OUTPUT) + public Message echo(Object value) throws Exception { + return MessageBuilder.withPayload(value.toString()).setHeader("contentType", new MimeType("text")).build(); + } + } + + @EnableBinding(Processor.class) + @Import(TestChannelBinderConfiguration.class) + @EnableAutoConfiguration +>>>>>>> f6381d72... GH-1533 Fixed regression in ObjectStringMessageConverter public static class ByteArrayToByteArrayStreamListener { @StreamListener(Processor.INPUT) @SendTo(Processor.OUTPUT)