GH-611 Fix regression for expectedContentType

This commit is contained in:
Oleg Zhurakousky
2020-11-20 22:40:49 +01:00
parent 6ee8205aea
commit 9c777b8d04
2 changed files with 49 additions and 15 deletions

View File

@@ -735,23 +735,11 @@ public class SimpleFunctionRegistry implements FunctionRegistry, FunctionInspect
Message outputMessage = null;
if (value instanceof Message) {
MessageHeaders headers = ((Message) value).getHeaders();
Map<String, Object> headersMap = (Map<String, Object>) ReflectionUtils
.getField(this.headersField, headers);
headersMap.put("accept", acceptedContentType);
// Set the contentType header to the value of accept for "legacy" reasons. But, do not set the
// contentType header to the value of accept if it is a wildcard type, as this doesn't make sense.
// This also applies to the else branch below.
if (acceptedContentType.isConcrete() && !headersMap.containsKey(MessageHeaders.CONTENT_TYPE)) {
headersMap.put(MessageHeaders.CONTENT_TYPE, acceptedContentType);
}
Map<String, Object> headersMap = (Map<String, Object>) ReflectionUtils.getField(this.headersField, headers);
headersMap.putIfAbsent(MessageHeaders.CONTENT_TYPE, acceptedContentType);
}
else {
MessageBuilder<Object> builder = MessageBuilder.withPayload(value)
.setHeader("accept", acceptedContentType);
if (acceptedContentType.isConcrete()) {
builder.setHeader(MessageHeaders.CONTENT_TYPE, acceptedContentType);
}
value = builder.build();
value = MessageBuilder.withPayload(value).setHeader(MessageHeaders.CONTENT_TYPE, acceptedContentType).build();
}
if (enricher != null) {
value = enricher.apply((Message) value);

View File

@@ -59,6 +59,7 @@ import org.springframework.messaging.support.MessageBuilder;
import org.springframework.stereotype.Component;
import org.springframework.util.CollectionUtils;
import org.springframework.util.MimeType;
import org.springframework.util.MimeTypeUtils;
import org.springframework.util.ReflectionUtils;
import static java.util.Collections.singletonList;
@@ -531,6 +532,13 @@ public class BeanFactoryAwareFunctionRegistryTests {
assertThat(result.block()).isEqualTo("hello");
}
@Test
public void testGH_611() {
FunctionCatalog catalog = this.configureCatalog(NegotiatingMessageConverterConfiguration.class);
Supplier<Message<Integer>> f = catalog.lookup("supplier", "text/*");
assertThat(f.get().getHeaders().get(MessageHeaders.CONTENT_TYPE)).isEqualTo(MimeTypeUtils.parseMimeType("text/*"));
}
@EnableAutoConfiguration
public static class PojoToMessageFunctionCompositionConfiguration {
@@ -595,6 +603,11 @@ public class BeanFactoryAwareFunctionRegistryTests {
@EnableAutoConfiguration
public static class NegotiatingMessageConverterConfiguration {
@Bean
public Supplier<Integer> supplier() {
return () -> 123;
}
@Bean
public Function<String, String> echo() {
return v -> v;
@@ -610,6 +623,11 @@ public class BeanFactoryAwareFunctionRegistryTests {
return new ConverterB();
}
@Bean
public MessageConverter messageConverterC() {
return new ConverterC();
}
public static class ConverterB extends ConverterA {
ConverterB() {
@@ -639,6 +657,34 @@ public class BeanFactoryAwareFunctionRegistryTests {
}
}
public static class ConverterC extends ConverterA {
ConverterC() {
super("text/*");
}
@Override
protected Object convertFromInternal(
Message<?> message, Class<?> targetClass, @Nullable Object conversionHint) {
return message.getPayload().toString();
}
@Override
public Object convertToInternal(Object rawPayload, MessageHeaders headers, Object conversionHint) {
return rawPayload;
}
@Override
protected boolean canConvertFrom(Message<?> message, @Nullable Class<?> targetClass) {
return supportsMimeType(message.getHeaders()) && Integer.class.isAssignableFrom(targetClass)
&& message.getPayload() instanceof Integer;
}
@Override
protected boolean canConvertTo(Object payload, @Nullable MessageHeaders headers) {
return payload instanceof Integer;
}
}
private static class ConverterA extends AbstractMessageConverter {
ConverterA() {