Skip to content

Commit 7135bc2

Browse files
committed
Reintroduced MessageMethodArgumentResolver default constructor
Issue: SPR-14616 (cherry picked from commit c4fff6d)
1 parent 9044706 commit 7135bc2

File tree

2 files changed

+62
-20
lines changed

2 files changed

+62
-20
lines changed

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

Lines changed: 15 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,6 @@
2626
import org.springframework.messaging.converter.SmartMessageConverter;
2727
import org.springframework.messaging.handler.invocation.HandlerMethodArgumentResolver;
2828
import org.springframework.messaging.support.MessageBuilder;
29-
import org.springframework.util.Assert;
3029
import org.springframework.util.ClassUtils;
3130
import org.springframework.util.StringUtils;
3231

@@ -38,6 +37,7 @@
3837
*
3938
* @author Rossen Stoyanchev
4039
* @author Stephane Nicoll
40+
* @author Juergen Hoeller
4141
* @since 4.0
4242
*/
4343
public class MessageMethodArgumentResolver implements HandlerMethodArgumentResolver {
@@ -46,12 +46,18 @@ public class MessageMethodArgumentResolver implements HandlerMethodArgumentResol
4646

4747

4848
/**
49-
* Create a new instance with the given {@link MessageConverter}.
50-
* @param converter the MessageConverter to use (required)
51-
* @since 4.1
49+
* Create a default resolver instance without message conversion.
50+
*/
51+
public MessageMethodArgumentResolver() {
52+
this(null);
53+
}
54+
55+
/**
56+
* Create a resolver instance with the given {@link MessageConverter}.
57+
* @param converter the MessageConverter to use (may be {@code null})
58+
* @since 4.3
5259
*/
5360
public MessageMethodArgumentResolver(MessageConverter converter) {
54-
Assert.notNull(converter, "MessageConverter must not be null");
5561
this.converter = converter;
5662
}
5763

@@ -63,7 +69,6 @@ public boolean supportsParameter(MethodParameter parameter) {
6369

6470
@Override
6571
public Object resolveArgument(MethodParameter parameter, Message<?> message) throws Exception {
66-
6772
Class<?> targetMessageType = parameter.getParameterType();
6873
Class<?> targetPayloadType = getPayloadType(parameter);
6974

@@ -117,20 +122,20 @@ else if (payload instanceof String) {
117122
}
118123

119124
private Object convertPayload(Message<?> message, MethodParameter parameter, Class<?> targetPayloadType) {
120-
Object result;
125+
Object result = null;
121126
if (this.converter instanceof SmartMessageConverter) {
122127
SmartMessageConverter smartConverter = (SmartMessageConverter) this.converter;
123128
result = smartConverter.fromMessage(message, targetPayloadType, parameter);
124129
}
125-
else {
130+
else if (this.converter != null) {
126131
result = this.converter.fromMessage(message, targetPayloadType);
127132
}
128133

129134
if (result == null) {
130135
String actual = ClassUtils.getQualifiedName(targetPayloadType);
131136
String expected = ClassUtils.getQualifiedName(message.getPayload().getClass());
132-
throw new MessageConversionException(message, "No converter found to convert payload " +
133-
"type [" + actual + "] to expected payload type [" + expected + "].");
137+
throw new MessageConversionException(message, "No converter found to convert payload type [" +
138+
actual + "] to expected payload type [" + expected + "]");
134139
}
135140
return result;
136141
}

spring-messaging/src/test/java/org/springframework/messaging/handler/annotation/support/MessageMethodArgumentResolverTests.java

Lines changed: 47 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -33,14 +33,13 @@
3333
import org.springframework.messaging.support.MessageBuilder;
3434

3535
import static org.junit.Assert.*;
36-
import static org.mockito.Mockito.mock;
37-
import static org.mockito.Mockito.when;
36+
import static org.mockito.Mockito.*;
3837

3938
/**
40-
* Unit tests for
41-
* {@link org.springframework.messaging.handler.annotation.support.MessageMethodArgumentResolver}.
39+
* Unit tests for {@link MessageMethodArgumentResolver}.
4240
*
4341
* @author Stephane Nicoll
42+
* @author Juergen Hoeller
4443
*/
4544
public class MessageMethodArgumentResolverTests {
4645

@@ -56,10 +55,8 @@ public class MessageMethodArgumentResolverTests {
5655

5756
@Before
5857
public void setup() throws Exception {
59-
6058
this.method = MessageMethodArgumentResolverTests.class.getDeclaredMethod("handle",
61-
Message.class, Message.class, Message.class, Message.class,
62-
ErrorMessage.class);
59+
Message.class, Message.class, Message.class, Message.class, ErrorMessage.class);
6360

6461
this.converter = mock(MessageConverter.class);
6562
this.resolver = new MessageMethodArgumentResolver(this.converter);
@@ -85,7 +82,7 @@ public void resolveWithMatchingPayloadType() throws Exception {
8582
}
8683

8784
@Test
88-
public void resolveWithPayloadTypeSubClass() throws Exception {
85+
public void resolveWithPayloadTypeSubclass() throws Exception {
8986
Message<Integer> message = MessageBuilder.withPayload(123).build();
9087
MethodParameter parameter = new MethodParameter(this.method, 2);
9188

@@ -155,7 +152,7 @@ public void resolveWithPayloadTypeOutOfBound() throws Exception {
155152
}
156153

157154
@Test
158-
public void resolveMessageSubClassMatch() throws Exception {
155+
public void resolveMessageSubclassMatch() throws Exception {
159156
ErrorMessage message = new ErrorMessage(new UnsupportedOperationException());
160157
MethodParameter parameter = new MethodParameter(this.method, 4);
161158

@@ -164,7 +161,7 @@ public void resolveMessageSubClassMatch() throws Exception {
164161
}
165162

166163
@Test
167-
public void resolveWithMessageSubClassAndPayloadWildcard() throws Exception {
164+
public void resolveWithMessageSubclassAndPayloadWildcard() throws Exception {
168165
ErrorMessage message = new ErrorMessage(new UnsupportedOperationException());
169166
MethodParameter parameter = new MethodParameter(this.method, 0);
170167

@@ -185,6 +182,46 @@ public void resolveWithWrongMessageType() throws Exception {
185182
assertSame(message, this.resolver.resolveArgument(parameter, message));
186183
}
187184

185+
@Test
186+
public void resolveWithPayloadTypeAsWildcardAndNoConverter() throws Exception {
187+
this.resolver = new MessageMethodArgumentResolver();
188+
189+
Message<String> message = MessageBuilder.withPayload("test").build();
190+
MethodParameter parameter = new MethodParameter(this.method, 0);
191+
192+
assertTrue(this.resolver.supportsParameter(parameter));
193+
assertSame(message, this.resolver.resolveArgument(parameter, message));
194+
}
195+
196+
@Test
197+
public void resolveWithConversionNeededButNoConverter() throws Exception {
198+
this.resolver = new MessageMethodArgumentResolver();
199+
200+
Message<String> message = MessageBuilder.withPayload("test").build();
201+
MethodParameter parameter = new MethodParameter(this.method, 1);
202+
203+
assertTrue(this.resolver.supportsParameter(parameter));
204+
thrown.expect(MessageConversionException.class);
205+
thrown.expectMessage(Integer.class.getName());
206+
thrown.expectMessage(String.class.getName());
207+
this.resolver.resolveArgument(parameter, message);
208+
}
209+
210+
@Test
211+
public void resolveWithConversionEmptyPayloadButNoConverter() throws Exception {
212+
this.resolver = new MessageMethodArgumentResolver();
213+
214+
Message<String> message = MessageBuilder.withPayload("").build();
215+
MethodParameter parameter = new MethodParameter(this.method, 1);
216+
217+
assertTrue(this.resolver.supportsParameter(parameter));
218+
thrown.expect(MessageConversionException.class);
219+
thrown.expectMessage("the payload is empty");
220+
thrown.expectMessage(Integer.class.getName());
221+
thrown.expectMessage(String.class.getName());
222+
this.resolver.resolveArgument(parameter, message);
223+
}
224+
188225

189226
@SuppressWarnings("unused")
190227
private void handle(

0 commit comments

Comments
 (0)