GH-611 Fix regression for expectedContentType
This commit is contained in:
@@ -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);
|
||||
|
||||
@@ -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() {
|
||||
|
||||
Reference in New Issue
Block a user