Skip to content

Commit c06ac06

Browse files
committed
JmsMessagingTemplate uses local convertJmsException template method instead of generic MessagingExceptionTranslator interface
This commit also turns MessagingException into a NestedRuntimeException subclass which delivers a root message that has the cause message appended to it. That's a common expectation with the use of Spring exceptions since all of our exception hierarchies have historically been designed that way. Issue: SPR-12064 Issue: SPR-12038
1 parent 6b6ca48 commit c06ac06

File tree

6 files changed

+45
-181
lines changed

6 files changed

+45
-181
lines changed

spring-jms/src/main/java/org/springframework/jms/core/JmsMessagingTemplate.java

Lines changed: 34 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -22,17 +22,17 @@
2222
import javax.jms.Session;
2323

2424
import org.springframework.beans.factory.InitializingBean;
25+
import org.springframework.jms.InvalidDestinationException;
2526
import org.springframework.jms.JmsException;
26-
import org.springframework.jms.support.JmsMessagingExceptionTranslator;
2727
import org.springframework.jms.support.converter.MessageConverter;
2828
import org.springframework.jms.support.converter.MessagingMessageConverter;
2929
import org.springframework.jms.support.converter.SimpleMessageConverter;
3030
import org.springframework.messaging.Message;
3131
import org.springframework.messaging.MessagingException;
3232
import org.springframework.messaging.converter.MessageConversionException;
3333
import org.springframework.messaging.core.AbstractMessagingTemplate;
34+
import org.springframework.messaging.core.DestinationResolutionException;
3435
import org.springframework.messaging.core.MessagePostProcessor;
35-
import org.springframework.messaging.support.MessagingExceptionTranslator;
3636
import org.springframework.util.Assert;
3737

3838
/**
@@ -48,8 +48,6 @@ public class JmsMessagingTemplate extends AbstractMessagingTemplate<Destination>
4848

4949
private MessageConverter jmsMessageConverter = new MessagingMessageConverter();
5050

51-
private MessagingExceptionTranslator exceptionTranslator = new JmsMessagingExceptionTranslator();
52-
5351
private String defaultDestinationName;
5452

5553

@@ -80,7 +78,7 @@ public void setJmsTemplate(JmsTemplate jmsTemplate) {
8078
* Return the configured {@link JmsTemplate}.
8179
*/
8280
public JmsTemplate getJmsTemplate() {
83-
return jmsTemplate;
81+
return this.jmsTemplate;
8482
}
8583

8684
/**
@@ -98,11 +96,11 @@ public void setJmsMessageConverter(MessageConverter jmsMessageConverter) {
9896
}
9997

10098
/**
101-
* Set the {@link MessagingExceptionTranslator} to use. Default to
102-
* {@link JmsMessagingExceptionTranslator}.
99+
* Return the {@link MessageConverter} to use to convert a {@link Message}
100+
* from the messaging to and from a {@link javax.jms.Message}.
103101
*/
104-
public void setExceptionTranslator(MessagingExceptionTranslator exceptionTranslator) {
105-
this.exceptionTranslator = exceptionTranslator;
102+
public MessageConverter getJmsMessageConverter() {
103+
return this.jmsMessageConverter;
106104
}
107105

108106
/**
@@ -124,8 +122,8 @@ public String getDefaultDestinationName() {
124122

125123
@Override
126124
public void afterPropertiesSet() {
127-
Assert.notNull(this.jmsTemplate, "Property 'jmsTemplate' is required");
128-
Assert.notNull(this.jmsMessageConverter, "Property 'jmsMessageConverter' is required");
125+
Assert.notNull(getJmsTemplate(), "Property 'jmsTemplate' is required");
126+
Assert.notNull(getJmsMessageConverter(), "Property 'jmsMessageConverter' is required");
129127
}
130128

131129

@@ -295,7 +293,7 @@ protected void doSend(Destination destination, Message<?> message) {
295293
this.jmsTemplate.send(destination, createMessageCreator(message));
296294
}
297295
catch (JmsException ex) {
298-
throw translateIfNecessary(ex);
296+
throw convertJmsException(ex);
299297
}
300298
}
301299

@@ -304,28 +302,28 @@ protected void doSend(String destinationName, Message<?> message) {
304302
this.jmsTemplate.send(destinationName, createMessageCreator(message));
305303
}
306304
catch (JmsException ex) {
307-
throw translateIfNecessary(ex);
305+
throw convertJmsException(ex);
308306
}
309307
}
310308

311309
@Override
312310
protected Message<?> doReceive(Destination destination) {
313311
try {
314312
javax.jms.Message jmsMessage = this.jmsTemplate.receive(destination);
315-
return doConvert(jmsMessage);
313+
return convertJmsMessage(jmsMessage);
316314
}
317315
catch (JmsException ex) {
318-
throw translateIfNecessary(ex);
316+
throw convertJmsException(ex);
319317
}
320318
}
321319

322320
protected Message<?> doReceive(String destinationName) {
323321
try {
324322
javax.jms.Message jmsMessage = this.jmsTemplate.receive(destinationName);
325-
return doConvert(jmsMessage);
323+
return convertJmsMessage(jmsMessage);
326324
}
327325
catch (JmsException ex) {
328-
throw translateIfNecessary(ex);
326+
throw convertJmsException(ex);
329327
}
330328
}
331329

@@ -334,26 +332,26 @@ protected Message<?> doSendAndReceive(Destination destination, Message<?> reques
334332
try {
335333
javax.jms.Message jmsMessage = this.jmsTemplate.sendAndReceive(
336334
destination, createMessageCreator(requestMessage));
337-
return doConvert(jmsMessage);
335+
return convertJmsMessage(jmsMessage);
338336
}
339337
catch (JmsException ex) {
340-
throw translateIfNecessary(ex);
338+
throw convertJmsException(ex);
341339
}
342340
}
343341

344342
protected Message<?> doSendAndReceive(String destinationName, Message<?> requestMessage) {
345343
try {
346344
javax.jms.Message jmsMessage = this.jmsTemplate.sendAndReceive(
347345
destinationName, createMessageCreator(requestMessage));
348-
return doConvert(jmsMessage);
346+
return convertJmsMessage(jmsMessage);
349347
}
350348
catch (JmsException ex) {
351-
throw translateIfNecessary(ex);
349+
throw convertJmsException(ex);
352350
}
353351
}
354352

355353
private MessagingMessageCreator createMessageCreator(Message<?> message) {
356-
return new MessagingMessageCreator(message, this.jmsMessageConverter);
354+
return new MessagingMessageCreator(message, getJmsMessageConverter());
357355
}
358356

359357
protected String getRequiredDefaultDestinationName() {
@@ -365,25 +363,29 @@ protected String getRequiredDefaultDestinationName() {
365363
return name;
366364
}
367365

368-
protected Message<?> doConvert(javax.jms.Message message) {
366+
protected Message<?> convertJmsMessage(javax.jms.Message message) {
369367
if (message == null) {
370368
return null;
371369
}
372370
try {
373-
return (Message<?>) this.jmsMessageConverter.fromMessage(message);
374-
}
375-
catch (JMSException ex) {
376-
throw new MessageConversionException("Could not convert '" + message + "'", ex);
371+
return (Message<?>) getJmsMessageConverter().fromMessage(message);
377372
}
378-
catch (JmsException ex) {
373+
catch (Exception ex) {
379374
throw new MessageConversionException("Could not convert '" + message + "'", ex);
380375
}
381376
}
382377

383378
@SuppressWarnings("ThrowableResultOfMethodCallIgnored")
384-
protected RuntimeException translateIfNecessary(RuntimeException rawException) {
385-
MessagingException messagingException = this.exceptionTranslator.translateExceptionIfPossible(rawException);
386-
return (messagingException != null ? messagingException : rawException);
379+
protected MessagingException convertJmsException(JmsException ex) {
380+
if (ex instanceof org.springframework.jms.support.destination.DestinationResolutionException ||
381+
ex instanceof InvalidDestinationException) {
382+
return new DestinationResolutionException(ex.getMessage(), ex);
383+
}
384+
if (ex instanceof org.springframework.jms.support.converter.MessageConversionException) {
385+
return new MessageConversionException(ex.getMessage(), ex);
386+
}
387+
// Fallback
388+
return new MessagingException(ex.getMessage(), ex);
387389
}
388390

389391

@@ -403,10 +405,7 @@ public javax.jms.Message createMessage(Session session) throws JMSException {
403405
try {
404406
return this.messageConverter.toMessage(this.message, session);
405407
}
406-
catch (JMSException ex) {
407-
throw new MessageConversionException("Could not convert '" + this.message + "'", ex);
408-
}
409-
catch (JmsException ex) {
408+
catch (Exception ex) {
410409
throw new MessageConversionException("Could not convert '" + this.message + "'", ex);
411410
}
412411
}

spring-jms/src/main/java/org/springframework/jms/support/JmsMessagingExceptionTranslator.java

Lines changed: 0 additions & 54 deletions
This file was deleted.

spring-jms/src/test/java/org/springframework/jms/core/JmsMessagingTemplateTests.java

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
import javax.jms.Session;
2727
import javax.jms.TextMessage;
2828

29+
import org.hamcrest.core.StringContains;
2930
import org.junit.Before;
3031
import org.junit.Rule;
3132
import org.junit.Test;
@@ -47,14 +48,12 @@
4748
import org.springframework.messaging.Message;
4849
import org.springframework.messaging.MessagingException;
4950
import org.springframework.messaging.converter.GenericMessageConverter;
50-
import org.springframework.messaging.converter.MessageConversionException;
5151
import org.springframework.messaging.support.MessageBuilder;
5252

5353
import static org.junit.Assert.*;
5454
import static org.mockito.BDDMockito.*;
5555

5656
/**
57-
*
5857
* @author Stephane Nicoll
5958
*/
6059
public class JmsMessagingTemplateTests {
@@ -193,16 +192,16 @@ public void convertAndSendCustomJmsMessageConverter() throws JMSException {
193192
messagingTemplate.setJmsMessageConverter(new SimpleMessageConverter() {
194193
@Override
195194
public javax.jms.Message toMessage(Object object, Session session)
196-
throws JMSException, MessageConversionException {
197-
throw new MessageConversionException("Test exception");
195+
throws JMSException, org.springframework.jms.support.converter.MessageConversionException {
196+
throw new org.springframework.jms.support.converter.MessageConversionException("Test exception");
198197
}
199198
});
200199

201200
messagingTemplate.convertAndSend("myQueue", "msg to convert");
202201
verify(jmsTemplate).send(eq("myQueue"), messageCreator.capture());
203202

204-
thrown.expect(MessageConversionException.class);
205-
thrown.expectMessage("Test exception");
203+
thrown.expect(org.springframework.messaging.converter.MessageConversionException.class);
204+
thrown.expectMessage(new StringContains("Test exception"));
206205
messageCreator.getValue().createMessage(mock(Session.class));
207206
}
208207

spring-jms/src/test/java/org/springframework/jms/support/JmsMessagingExceptionTranslatorTests.java

Lines changed: 0 additions & 35 deletions
This file was deleted.

spring-messaging/src/main/java/org/springframework/messaging/MessagingException.java

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright 2002-2013 the original author or authors.
2+
* Copyright 2002-2014 the original author or authors.
33
*
44
* Licensed under the Apache License, Version 2.0 (the "License");
55
* you may not use this file except in compliance with the License.
@@ -16,6 +16,8 @@
1616

1717
package org.springframework.messaging;
1818

19+
import org.springframework.core.NestedRuntimeException;
20+
1921
/**
2022
* The base exception for any failures related to messaging.
2123
*
@@ -24,13 +26,13 @@
2426
* @since 4.0
2527
*/
2628
@SuppressWarnings("serial")
27-
public class MessagingException extends RuntimeException {
29+
public class MessagingException extends NestedRuntimeException {
2830

2931
private final Message<?> failedMessage;
3032

3133

3234
public MessagingException(Message<?> message) {
33-
super();
35+
super("");
3436
this.failedMessage = message;
3537
}
3638

@@ -50,7 +52,7 @@ public MessagingException(Message<?> message, String description) {
5052
}
5153

5254
public MessagingException(Message<?> message, Throwable cause) {
53-
super(cause);
55+
super("", cause);
5456
this.failedMessage = message;
5557
}
5658

0 commit comments

Comments
 (0)