Skip to content

Commit 15e1af2

Browse files
committed
Protected methods to determine payload target type
Closes gh-22035
1 parent e16a134 commit 15e1af2

File tree

2 files changed

+30
-3
lines changed

2 files changed

+30
-3
lines changed

spring-messaging/src/main/java/org/springframework/messaging/handler/annotation/support/MessageMethodArgumentResolver.java

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -72,7 +72,7 @@ public boolean supportsParameter(MethodParameter parameter) {
7272
@Override
7373
public Object resolveArgument(MethodParameter parameter, Message<?> message) throws Exception {
7474
Class<?> targetMessageType = parameter.getParameterType();
75-
Class<?> targetPayloadType = getPayloadType(parameter);
75+
Class<?> targetPayloadType = getPayloadType(parameter, message);
7676

7777
if (!targetMessageType.isAssignableFrom(message.getClass())) {
7878
throw new MethodArgumentTypeMismatchException(message, parameter, "Actual message type '" +
@@ -95,7 +95,19 @@ public Object resolveArgument(MethodParameter parameter, Message<?> message) thr
9595
return MessageBuilder.createMessage(payload, message.getHeaders());
9696
}
9797

98-
private Class<?> getPayloadType(MethodParameter parameter) {
98+
/**
99+
* Resolve the target class to convert the payload to.
100+
* <p>By default this is the generic type declared in the {@code Message}
101+
* method parameter but that can be overridden to select a more specific
102+
* target type after also taking into account the "Content-Type", e.g.
103+
* return {@code String} if target type is {@code Object} and
104+
* {@code "Content-Type:text/**"}.
105+
* @param parameter the target method parameter
106+
* @param message the message bring processed
107+
* @return the target type to use
108+
* @since 5.2
109+
*/
110+
protected Class<?> getPayloadType(MethodParameter parameter, Message<?> message) {
99111
Type genericParamType = parameter.getGenericParameterType();
100112
ResolvableType resolvableType = ResolvableType.forType(genericParamType).as(Message.class);
101113
return resolvableType.getGeneric().toClass();

spring-messaging/src/main/java/org/springframework/messaging/handler/annotation/support/PayloadMethodArgumentResolver.java

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -126,7 +126,7 @@ public Object resolveArgument(MethodParameter parameter, Message<?> message) thr
126126
}
127127
}
128128

129-
Class<?> targetClass = parameter.getParameterType();
129+
Class<?> targetClass = resolveTargetClass(parameter, message);
130130
Class<?> payloadClass = payload.getClass();
131131
if (ClassUtils.isAssignable(targetClass, payloadClass)) {
132132
validate(message, parameter, payload);
@@ -173,6 +173,21 @@ else if (payload instanceof String) {
173173
}
174174
}
175175

176+
/**
177+
* Resolve the target class to convert the payload to.
178+
* <p>By default this is simply {@link MethodParameter#getParameterType()}
179+
* but that can be overridden to select a more specific target type after
180+
* also taking into account the "Content-Type", e.g. return {@code String}
181+
* if target type is {@code Object} and {@code "Content-Type:text/**"}.
182+
* @param parameter the target method parameter
183+
* @param message the message bring processed
184+
* @return the target type to use
185+
* @since 5.2
186+
*/
187+
protected Class<?> resolveTargetClass(MethodParameter parameter, Message<?> message) {
188+
return parameter.getParameterType();
189+
}
190+
176191
/**
177192
* Validate the payload if applicable.
178193
* <p>The default implementation checks for {@code @javax.validation.Valid},

0 commit comments

Comments
 (0)