Skip to content

Commit 4e0667c

Browse files
committed
Fix deprecation errors & warnings
* Add `<@nullable Object>` for API with nullable based on generics * Migrate to `org.springframework.expression.spel.support.MapAccessor` from deprecated `org.springframework.context.expression.MapAccessor` * Improve `TestUtils` to register a `nullChannel` as a `Queue` * Improve `TestApplicationContextAware` to clean up `nullChannel` from test context before test class is run * `IntegrationFlowTests.retryAdvice()` to avoid a long delay for the whole test suite * Fix many failing tests for `TestApplicationContextAware` or manual `GenericApplicationContext`
1 parent 5dce7bd commit 4e0667c

File tree

36 files changed

+282
-395
lines changed

36 files changed

+282
-395
lines changed

spring-integration-amqp/src/main/java/org/springframework/integration/amqp/inbound/AmqpInboundChannelAdapter.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -382,7 +382,7 @@ public void onMessage(final Message message, @Nullable Channel channel) {
382382
final org.springframework.messaging.Message<Object> toSend =
383383
createMessageFromAmqp(message, channel);
384384
try {
385-
this.retryOps.execute(
385+
this.retryOps.<@Nullable Object>execute(
386386
() -> {
387387
AtomicInteger deliveryAttempt = StaticMessageHeaderAccessor.getDeliveryAttempt(toSend);
388388
if (deliveryAttempt != null) {
@@ -508,7 +508,7 @@ public void onMessageBatch(List<Message> messages, @Nullable Channel channel) {
508508
}
509509
else {
510510
try {
511-
this.retryOps.execute(
511+
this.retryOps.<@Nullable Object>execute(
512512
() -> {
513513
AtomicInteger deliveryAttempt =
514514
StaticMessageHeaderAccessor.getDeliveryAttempt(message);

spring-integration-amqp/src/main/java/org/springframework/integration/amqp/inbound/AmqpInboundGateway.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -366,7 +366,7 @@ public void onMessage(final Message message, @Nullable Channel channel) {
366366
org.springframework.messaging.Message<Object> converted = convert(message, channel);
367367
if (converted != null) {
368368
try {
369-
AmqpInboundGateway.this.retryTemplate.execute(() -> {
369+
AmqpInboundGateway.this.retryTemplate.<@Nullable Object>execute(() -> {
370370
AtomicInteger deliveryAttempt = StaticMessageHeaderAccessor.getDeliveryAttempt(converted);
371371
if (deliveryAttempt != null) {
372372
deliveryAttempt.incrementAndGet();

spring-integration-amqp/src/main/java/org/springframework/integration/amqp/outbound/AmqpOutboundEndpoint.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -198,7 +198,7 @@ private void multiSend(Message<?> requestMessage, @Nullable String exchangeName,
198198
});
199199
RabbitTemplate rabbitTemplateToUse = this.rabbitTemplate;
200200
Assert.notNull(rabbitTemplateToUse, "The 'RabbitTemplate' must be provided for multi-send.");
201-
rabbitTemplateToUse.invoke(template -> {
201+
rabbitTemplateToUse.<@Nullable Object>invoke(template -> {
202202
((Iterable<Message<?>>) requestMessage.getPayload())
203203
.forEach(message -> doRabbitSend(exchangeName, routingKey, message, null, rabbitTemplateToUse));
204204
if (this.waitForConfirm) {

spring-integration-amqp/src/main/java/org/springframework/integration/amqp/support/BoundRabbitChannelAdvice.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -83,7 +83,7 @@ public BoundRabbitChannelAdvice(RabbitOperations operations, @Nullable Duration
8383
@Override
8484
public @Nullable Object invoke(MethodInvocation invocation) throws Throwable {
8585
try {
86-
return this.operations.invoke(operations -> {
86+
return this.operations.<@Nullable Object>invoke(operations -> {
8787
try {
8888
Object result = invocation.proceed();
8989
if (this.waitForConfirmsTimeout != null) {

spring-integration-core/src/main/java/org/springframework/integration/config/IntegrationEvaluationContextFactoryBean.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,11 +24,11 @@
2424
import org.springframework.beans.factory.FactoryBean;
2525
import org.springframework.context.ApplicationContext;
2626
import org.springframework.context.expression.BeanFactoryResolver;
27-
import org.springframework.context.expression.MapAccessor;
2827
import org.springframework.expression.BeanResolver;
2928
import org.springframework.expression.IndexAccessor;
3029
import org.springframework.expression.PropertyAccessor;
3130
import org.springframework.expression.TypeLocator;
31+
import org.springframework.expression.spel.support.MapAccessor;
3232
import org.springframework.expression.spel.support.StandardEvaluationContext;
3333
import org.springframework.expression.spel.support.StandardTypeLocator;
3434
import org.springframework.integration.context.IntegrationContextUtils;

spring-integration-core/src/main/java/org/springframework/integration/config/IntegrationSimpleEvaluationContextFactoryBean.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,10 +21,10 @@
2121
import java.util.Map.Entry;
2222

2323
import org.springframework.beans.factory.FactoryBean;
24-
import org.springframework.context.expression.MapAccessor;
2524
import org.springframework.expression.IndexAccessor;
2625
import org.springframework.expression.PropertyAccessor;
2726
import org.springframework.expression.spel.support.DataBindingPropertyAccessor;
27+
import org.springframework.expression.spel.support.MapAccessor;
2828
import org.springframework.expression.spel.support.SimpleEvaluationContext;
2929
import org.springframework.integration.context.IntegrationContextUtils;
3030

spring-integration-core/src/main/java/org/springframework/integration/expression/ExpressionUtils.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,14 +25,14 @@
2525
import org.jspecify.annotations.Nullable;
2626

2727
import org.springframework.beans.factory.BeanFactory;
28-
import org.springframework.context.expression.MapAccessor;
2928
import org.springframework.core.convert.ConversionService;
3029
import org.springframework.core.io.Resource;
3130
import org.springframework.expression.EvaluationContext;
3231
import org.springframework.expression.Expression;
3332
import org.springframework.expression.ExpressionParser;
3433
import org.springframework.expression.spel.standard.SpelExpressionParser;
3534
import org.springframework.expression.spel.support.DataBindingPropertyAccessor;
35+
import org.springframework.expression.spel.support.MapAccessor;
3636
import org.springframework.expression.spel.support.SimpleEvaluationContext;
3737
import org.springframework.expression.spel.support.StandardEvaluationContext;
3838
import org.springframework.integration.context.IntegrationContextUtils;

spring-integration-core/src/main/java/org/springframework/integration/handler/advice/RequestHandlerRetryAdvice.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -158,7 +158,7 @@ public void setNewMessagePredicate(Predicate<Message<?>> newMessagePredicate) {
158158
AttributeAccessor retryContext = ErrorMessageUtils.getAttributeAccessor(message, message);
159159
try {
160160
if (this.stateKeyFunction == null) {
161-
return this.retryTemplate.execute(retryCallback);
161+
return this.retryTemplate.<@Nullable Object>execute(retryCallback);
162162
}
163163

164164
return statefulRetry(retryCallback, this.stateKeyFunction);
@@ -253,7 +253,7 @@ else if (cause instanceof ThrowableHolderException throwableHolderException) {
253253
}
254254

255255
private record IntegrationRetryCallback(Message<?> messageToTry, ExecutionCallback callback, Object target)
256-
implements Retryable<Object> {
256+
implements Retryable<@Nullable Object> {
257257

258258
@Override
259259
public @Nullable Object execute() {

spring-integration-core/src/test/java/org/springframework/integration/bus/DirectChannelSubscriptionTests.java

Lines changed: 9 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -20,17 +20,16 @@
2020
import org.junit.jupiter.api.BeforeEach;
2121
import org.junit.jupiter.api.Test;
2222

23+
import org.springframework.context.support.GenericApplicationContext;
2324
import org.springframework.integration.annotation.MessageEndpoint;
2425
import org.springframework.integration.annotation.ServiceActivator;
2526
import org.springframework.integration.channel.DirectChannel;
2627
import org.springframework.integration.channel.QueueChannel;
2728
import org.springframework.integration.config.IntegrationRegistrar;
28-
import org.springframework.integration.context.IntegrationContextUtils;
2929
import org.springframework.integration.endpoint.EventDrivenConsumer;
3030
import org.springframework.integration.handler.AbstractReplyProducingMessageHandler;
3131
import org.springframework.integration.handler.ServiceActivatingHandler;
3232
import org.springframework.integration.test.util.TestUtils;
33-
import org.springframework.integration.test.util.TestUtils.TestApplicationContext;
3433
import org.springframework.messaging.Message;
3534
import org.springframework.messaging.MessagingException;
3635
import org.springframework.messaging.PollableChannel;
@@ -46,7 +45,7 @@
4645
*/
4746
public class DirectChannelSubscriptionTests {
4847

49-
private final TestApplicationContext context = TestUtils.createTestApplicationContext();
48+
private final GenericApplicationContext context = new GenericApplicationContext();
5049

5150
private final DirectChannel sourceChannel = new DirectChannel();
5251

@@ -55,8 +54,8 @@ public class DirectChannelSubscriptionTests {
5554
@BeforeEach
5655
public void setupChannels() {
5756
new IntegrationRegistrar().registerBeanDefinitions(mock(), this.context.getDefaultListableBeanFactory());
58-
this.context.registerChannel("sourceChannel", this.sourceChannel);
59-
this.context.registerChannel("targetChannel", this.targetChannel);
57+
TestUtils.registerBean("sourceChannel", this.sourceChannel, this.context);
58+
TestUtils.registerBean("targetChannel", this.targetChannel, this.context);
6059
}
6160

6261
@AfterEach
@@ -68,9 +67,9 @@ public void tearDown() {
6867
public void sendAndReceiveForRegisteredEndpoint() {
6968
ServiceActivatingHandler serviceActivator = new ServiceActivatingHandler(new TestBean(), "handle");
7069
serviceActivator.setOutputChannel(this.targetChannel);
71-
context.registerBean("testServiceActivator", serviceActivator);
70+
TestUtils.registerBean("testServiceActivator", serviceActivator, this.context);
7271
EventDrivenConsumer endpoint = new EventDrivenConsumer(this.sourceChannel, serviceActivator);
73-
context.registerEndpoint("testEndpoint", endpoint);
72+
TestUtils.registerBean("testEndpoint", endpoint, this.context);
7473
context.refresh();
7574
this.sourceChannel.send(new GenericMessage<>("foo"));
7675
Message<?> response = this.targetChannel.receive();
@@ -79,7 +78,7 @@ public void sendAndReceiveForRegisteredEndpoint() {
7978

8079
@Test
8180
public void sendAndReceiveForAnnotatedEndpoint() {
82-
this.context.registerEndpoint("testEndpoint", new TestEndpoint());
81+
TestUtils.registerBean("testEndpoint", new TestEndpoint(), this.context);
8382
this.context.refresh();
8483

8584
this.sourceChannel.send(new GenericMessage<>("foo"));
@@ -98,17 +97,15 @@ public Object handleRequestMessage(Message<?> message) {
9897
};
9998
handler.setOutputChannel(targetChannel);
10099
EventDrivenConsumer endpoint = new EventDrivenConsumer(sourceChannel, handler);
101-
this.context.registerEndpoint("testEndpoint", endpoint);
100+
TestUtils.registerBean("testEndpoint", endpoint, this.context);
102101
this.context.refresh();
103102
assertThatExceptionOfType(MessagingException.class)
104103
.isThrownBy(() -> this.sourceChannel.send(new GenericMessage<>("foo")));
105104
}
106105

107106
@Test
108107
public void exceptionThrownFromAnnotatedEndpoint() {
109-
QueueChannel errorChannel = new QueueChannel();
110-
this.context.registerChannel(IntegrationContextUtils.ERROR_CHANNEL_BEAN_NAME, errorChannel);
111-
this.context.registerEndpoint("testEndpoint", new FailingTestEndpoint());
108+
TestUtils.registerBean("testEndpoint", new FailingTestEndpoint(), this.context);
112109
this.context.refresh();
113110
assertThatExceptionOfType(MessagingException.class)
114111
.isThrownBy(() -> this.sourceChannel.send(new GenericMessage<>("foo")));

spring-integration-core/src/test/java/org/springframework/integration/channel/registry/HeaderChannelRegistryTests.java

Lines changed: 10 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -19,13 +19,8 @@
1919
import java.util.Map;
2020

2121
import org.junit.jupiter.api.Test;
22-
import org.mockito.Mockito;
2322

24-
import org.springframework.beans.factory.BeanFactory;
25-
import org.springframework.beans.factory.NoSuchBeanDefinitionException;
2623
import org.springframework.beans.factory.annotation.Autowired;
27-
import org.springframework.context.expression.MapAccessor;
28-
import org.springframework.expression.spel.support.StandardEvaluationContext;
2924
import org.springframework.integration.channel.DefaultHeaderChannelRegistry;
3025
import org.springframework.integration.channel.DirectChannel;
3126
import org.springframework.integration.channel.MessagePublishingErrorHandler;
@@ -36,7 +31,6 @@
3631
import org.springframework.integration.support.MessageBuilder;
3732
import org.springframework.integration.support.MessagingExceptionWrapper;
3833
import org.springframework.integration.support.channel.BeanFactoryChannelResolver;
39-
import org.springframework.integration.support.channel.HeaderChannelRegistry;
4034
import org.springframework.integration.test.support.TestApplicationContextAware;
4135
import org.springframework.integration.test.util.TestUtils;
4236
import org.springframework.messaging.Message;
@@ -51,10 +45,6 @@
5145

5246
import static org.assertj.core.api.Assertions.assertThat;
5347
import static org.assertj.core.api.Assertions.assertThatExceptionOfType;
54-
import static org.mockito.ArgumentMatchers.eq;
55-
import static org.mockito.Mockito.doAnswer;
56-
import static org.mockito.Mockito.mock;
57-
import static org.mockito.Mockito.when;
5848

5949
/**
6050
* @author Gary Russell
@@ -216,28 +206,22 @@ public void testExpire() throws Exception {
216206
@Test
217207
public void testBFCRWithRegistry() {
218208
BeanFactoryChannelResolver resolver = new BeanFactoryChannelResolver();
219-
BeanFactory beanFactory = createTestEvaluationContext();
220-
when(beanFactory.getBean(IntegrationContextUtils.INTEGRATION_HEADER_CHANNEL_REGISTRY_BEAN_NAME,
221-
HeaderChannelRegistry.class))
222-
.thenReturn(mock(HeaderChannelRegistry.class));
223-
doAnswer(invocation -> {
224-
throw new NoSuchBeanDefinitionException("bar");
225-
}).when(beanFactory).getBean("foo", MessageChannel.class);
226-
resolver.setBeanFactory(beanFactory);
209+
TestUtils.registerBean(IntegrationContextUtils.INTEGRATION_HEADER_CHANNEL_REGISTRY_BEAN_NAME,
210+
new DefaultHeaderChannelRegistry(), TEST_INTEGRATION_CONTEXT);
211+
resolver.setBeanFactory(TEST_INTEGRATION_CONTEXT);
227212

228213
assertThatExceptionOfType(DestinationResolutionException.class)
229214
.isThrownBy(() -> resolver.resolveDestination("foo"))
230215
.withMessageContaining("failed to look up MessageChannel with name 'foo' in the BeanFactory.");
216+
217+
TEST_INTEGRATION_CONTEXT.removeBeanDefinition(
218+
IntegrationContextUtils.INTEGRATION_HEADER_CHANNEL_REGISTRY_BEAN_NAME);
231219
}
232220

233221
@Test
234222
public void testBFCRNoRegistry() {
235223
BeanFactoryChannelResolver resolver = new BeanFactoryChannelResolver();
236-
BeanFactory beanFactory = createTestEvaluationContext();
237-
doAnswer(invocation -> {
238-
throw new NoSuchBeanDefinitionException("bar");
239-
}).when(beanFactory).getBean("foo", MessageChannel.class);
240-
resolver.setBeanFactory(beanFactory);
224+
resolver.setBeanFactory(TEST_INTEGRATION_CONTEXT);
241225

242226
assertThatExceptionOfType(DestinationResolutionException.class)
243227
.isThrownBy(() -> resolver.resolveDestination("foo"))
@@ -252,12 +236,12 @@ public void testRemoveOnGet() {
252236
MessageChannel channel = new DirectChannel();
253237
String foo = (String) registry.channelToChannelName(channel);
254238
Map<?, ?> map = TestUtils.getPropertyValue(registry, "channels", Map.class);
255-
assertThat(map.size()).isEqualTo(1);
239+
assertThat(map).hasSize(1);
256240
assertThat(registry.channelNameToChannel(foo)).isSameAs(channel);
257-
assertThat(map.size()).isEqualTo(1);
241+
assertThat(map).hasSize(1);
258242
registry.setRemoveOnGet(true);
259243
assertThat(registry.channelNameToChannel(foo)).isSameAs(channel);
260-
assertThat(map.size()).isEqualTo(0);
244+
assertThat(map).hasSize(0);
261245
}
262246

263247
public static class Foo extends AbstractReplyProducingMessageHandler {
@@ -282,19 +266,6 @@ protected Object handleRequestMessage(Message<?> requestMessage) {
282266

283267
}
284268

285-
private static BeanFactory createTestEvaluationContext() {
286-
final String integrationEvaluationContextBeanName = "integrationEvaluationContext";
287-
BeanFactory beanFactory = mock(BeanFactory.class);
288-
when(beanFactory.containsBean(eq(integrationEvaluationContextBeanName)))
289-
.thenReturn(true);
290-
StandardEvaluationContext evaluationContext = new StandardEvaluationContext();
291-
evaluationContext.addPropertyAccessor(new MapAccessor());
292-
when(beanFactory.getBean(eq(integrationEvaluationContextBeanName),
293-
Mockito.<Class<StandardEvaluationContext>>any()))
294-
.thenReturn(evaluationContext);
295-
return beanFactory;
296-
}
297-
298269
public interface Gateway {
299270

300271
String exchange(String foo);

0 commit comments

Comments
 (0)