Fix SmartCompositeMessageConverter to ensure it properly injects contentType

Initial refactoring web - test pass
This commit is contained in:
Oleg Zhurakousky
2020-11-02 09:37:35 +01:00
parent a7104e489e
commit 63a1c3228d
9 changed files with 120 additions and 49 deletions

View File

@@ -811,7 +811,7 @@ public class SimpleFunctionRegistry implements FunctionRegistry, FunctionInspect
}
else if (!ObjectUtils.isEmpty(contentType)) {
convertedOutput = messageConverter.toMessage(output,
new MessageHeaders(Collections.singletonMap(MessageHeaders.CONTENT_TYPE, MimeType.valueOf(contentType[0]))));
new MessageHeaders(Collections.singletonMap(MessageHeaders.CONTENT_TYPE, contentType[0])));
}
return convertedOutput;

View File

@@ -103,9 +103,10 @@ public class ContextFunctionCatalogAutoConfiguration {
// mcList.add(NegotiatingMessageConverterWrapper.wrap(new ByteArrayMessageConverter()));
// mcList.add(NegotiatingMessageConverterWrapper.wrap(new StringMessageConverter()));
mcList.add(new StringMessageConverter());
mcList.add(new JsonMessageConverter(jsonMapper));
mcList.add(new ByteArrayMessageConverter());
mcList.add(new StringMessageConverter());
if (!CollectionUtils.isEmpty(mcList)) {
messageConverter = new SmartCompositeMessageConverter(mcList);

View File

@@ -172,10 +172,11 @@ public class ContextFunctionCatalogInitializer implements ApplicationContextInit
// messageConverters.add(NegotiatingMessageConverterWrapper.wrap(new JsonMessageConverter(jsonMapper)));
// messageConverters.add(NegotiatingMessageConverterWrapper.wrap(new ByteArrayMessageConverter()));
// messageConverters.add(NegotiatingMessageConverterWrapper.wrap(new StringMessageConverter()));
messageConverters.add(new StringMessageConverter());
messageConverters.add(new JsonMessageConverter(jsonMapper));
messageConverters.add(new ByteArrayMessageConverter());
messageConverters.add(new StringMessageConverter());
CompositeMessageConverter messageConverter = new CompositeMessageConverter(messageConverters);
SmartCompositeMessageConverter messageConverter = new SmartCompositeMessageConverter(messageConverters);
ConversionService conversionService = new DefaultConversionService();
return new SimpleFunctionRegistry(conversionService, messageConverter, this.context.getBean(JsonMapper.class));

View File

@@ -27,8 +27,8 @@ import org.springframework.messaging.converter.CompositeMessageConverter;
import org.springframework.messaging.converter.MessageConverter;
import org.springframework.messaging.converter.SmartMessageConverter;
import org.springframework.messaging.support.MessageHeaderAccessor;
import org.springframework.util.CollectionUtils;
import org.springframework.util.MimeType;
import org.springframework.util.StringUtils;
/**
*
@@ -67,28 +67,36 @@ public class SmartCompositeMessageConverter extends CompositeMessageConverter {
return null;
}
@SuppressWarnings("unchecked")
@Override
@Nullable
public Message<?> toMessage(Object payload, @Nullable MessageHeaders headers) {
for (MessageConverter converter : getConverters()) {
MessageHeaderAccessor accessor = new MessageHeaderAccessor();
accessor.copyHeaders(headers);
if (this.isNotConcreteContentType(accessor, converter)) {
List<MimeType> supportedMimeTypes = ((AbstractMessageConverter) converter).getSupportedMimeTypes();
for (MimeType supportedMimeType : supportedMimeTypes) {
accessor.setHeader(MessageHeaders.CONTENT_TYPE, supportedMimeType);
Message<?> result = converter.toMessage(payload, accessor.getMessageHeaders());
Object value = headers.get(MessageHeaders.CONTENT_TYPE).toString();
String[] contentTypes = StringUtils.delimitedListToStringArray((String) value, ",");
for (String contentType : contentTypes) {
if (!MimeType.valueOf(contentType).isConcrete()) {
List<MimeType> supportedMimeTypes = ((AbstractMessageConverter) converter).getSupportedMimeTypes();
for (MimeType supportedMimeType : supportedMimeTypes) {
MessageHeaderAccessor h = new MessageHeaderAccessor();
h.copyHeaders(headers);
h.setHeader(MessageHeaders.CONTENT_TYPE, supportedMimeType);
Message<?> result = converter.toMessage(payload, h.getMessageHeaders());
if (result != null) {
return result;
}
}
}
else {
MessageHeaderAccessor h = new MessageHeaderAccessor();
h.copyHeaders(headers);
h.setHeader(MessageHeaders.CONTENT_TYPE, contentType);
Message<?> result = converter.toMessage(payload, h.getMessageHeaders());
if (result != null) {
return result;
}
}
}
else {
Message<?> result = converter.toMessage(payload, headers);
if (result != null) {
return result;
}
}
}
return null;
}
@@ -96,32 +104,33 @@ public class SmartCompositeMessageConverter extends CompositeMessageConverter {
@Override
@Nullable
public Message<?> toMessage(Object payload, @Nullable MessageHeaders headers, @Nullable Object conversionHint) {
for (MessageConverter converter : getConverters()) {
MessageHeaderAccessor accessor = new MessageHeaderAccessor();
accessor.copyHeaders(headers);
if (this.isNotConcreteContentType(accessor, converter)) {
List<MimeType> supportedMimeTypes = ((AbstractMessageConverter) converter).getSupportedMimeTypes();
for (MimeType supportedMimeType : supportedMimeTypes) {
accessor.setHeader(MessageHeaders.CONTENT_TYPE, supportedMimeType);
Message<?> result = ((AbstractMessageConverter) converter).toMessage(payload, accessor.getMessageHeaders(), conversionHint);
Object value = headers.get(MessageHeaders.CONTENT_TYPE).toString();
String[] contentTypes = StringUtils.delimitedListToStringArray((String) value, ",");
for (String contentType : contentTypes) {
if (!MimeType.valueOf(contentType).isConcrete()) {
List<MimeType> supportedMimeTypes = ((AbstractMessageConverter) converter).getSupportedMimeTypes();
for (MimeType supportedMimeType : supportedMimeTypes) {
MessageHeaderAccessor h = new MessageHeaderAccessor();
h.copyHeaders(headers);
h.setHeader(MessageHeaders.CONTENT_TYPE, supportedMimeType);
Message<?> result = ((SmartMessageConverter) converter).toMessage(payload, h.getMessageHeaders(), conversionHint);
if (result != null) {
return result;
}
}
}
else {
MessageHeaderAccessor h = new MessageHeaderAccessor();
h.copyHeaders(headers);
h.setHeader(MessageHeaders.CONTENT_TYPE, contentType);
Message<?> result = ((SmartMessageConverter) converter).toMessage(payload, h.getMessageHeaders(), conversionHint);
if (result != null) {
return result;
}
}
}
else {
Message<?> result = ((AbstractMessageConverter) converter).toMessage(payload, headers, conversionHint);
if (result != null) {
return result;
}
}
}
return null;
}
private boolean isNotConcreteContentType(MessageHeaderAccessor accessor, MessageConverter converter) {
return !accessor.getContentType().isConcrete() && converter instanceof AbstractMessageConverter
&& !CollectionUtils.isEmpty(((AbstractMessageConverter) converter).getSupportedMimeTypes());
}
}