Skip to content

Commit e8ca83c

Browse files
Register Expression serializer on binder ObjectMapper
Restore the intended Expression serializer registration so bindings actuator output can render SpEL expressions as strings instead of traversing Expression internals.
1 parent 161f91b commit e8ca83c

2 files changed

Lines changed: 21 additions & 1 deletion

File tree

core/spring-cloud-stream/src/main/java/org/springframework/cloud/stream/binder/AbstractMessageChannelBinder.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -157,7 +157,7 @@ protected void onInit() throws Exception {
157157
// }
158158
SimpleModule module = new SimpleModule();
159159
module.addSerializer(Expression.class, new ExpressionSerializer(Expression.class));
160-
this.objectMapper = this.objectMapper.rebuild().build();
160+
this.objectMapper = this.objectMapper.rebuild().addModule(module).build();
161161
}
162162

163163
public AbstractMessageChannelBinder(String[] headersToEmbed, PP provisioningProvider,

core/spring-cloud-stream/src/test/java/org/springframework/cloud/stream/binder/AbstractMessageChannelBinderTests.java

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,8 @@
2727
import org.springframework.cloud.stream.provisioning.ConsumerDestination;
2828
import org.springframework.cloud.stream.provisioning.ProducerDestination;
2929
import org.springframework.context.support.GenericApplicationContext;
30+
import org.springframework.expression.Expression;
31+
import org.springframework.expression.spel.standard.SpelExpressionParser;
3032
import org.springframework.integration.core.MessageProducer;
3133
import org.springframework.messaging.MessageChannel;
3234
import org.springframework.messaging.MessageHandler;
@@ -60,6 +62,24 @@ void serializeDurationOnObjectMapperInAMCB() throws Exception {
6062
assertThat(convertedMap).isNotEmpty();
6163
}
6264

65+
@Test
66+
@SuppressWarnings("unchecked")
67+
void serializeExpressionOnObjectMapperInAMCB() throws Exception {
68+
AbstractMessageChannelBinder<?, ?, ?> binder = createBinderInstance();
69+
70+
Field objectMapperField = ReflectionUtils.findField(AbstractMessageChannelBinder.class, "objectMapper");
71+
assertThat(objectMapperField).isNotNull();
72+
ReflectionUtils.makeAccessible(objectMapperField);
73+
ObjectMapper objectMapper = (ObjectMapper) ReflectionUtils.getField(objectMapperField, binder);
74+
assertThat(objectMapper).isNotNull();
75+
76+
Expression expression = new SpelExpressionParser().parseExpression("'routing.key'");
77+
Map<String, Object> properties = Map.of("routingKeyExpression", expression);
78+
Map<String, Object> convertedMap = objectMapper.convertValue(properties, Map.class);
79+
80+
assertThat(convertedMap).containsEntry("routingKeyExpression", "'routing.key'");
81+
}
82+
6383
@NotNull
6484
private static AbstractMessageChannelBinder<?, ?, ?> createBinderInstance() throws Exception {
6585
AbstractMessageChannelBinder<?, ?, ?> binder = new AbstractMessageChannelBinder<>(null, null) {

0 commit comments

Comments
 (0)