Skip to content

Commit 24f699d

Browse files
authored
GH-10083: Fix Nullability in some missed packages (#10312)
Related to: #10083 * Turn `EntryEventMessagePayload` into `record`. * Fix access from tests, respectively * Extract `ParameterExpressionEvaluator` into a top-level class as it is expected by the `ExpressionEvaluatingParameterSource` * Tighten `JpaParameter` contract in the `ExpressionEvaluatingParameterSourceFactory.obtainParameterValue()`
1 parent c7b1dea commit 24f699d

File tree

17 files changed

+160
-165
lines changed

17 files changed

+160
-165
lines changed

spring-integration-hazelcast/src/main/java/org/springframework/integration/hazelcast/message/EntryEventMessagePayload.java

Lines changed: 6 additions & 54 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@
1616

1717
package org.springframework.integration.hazelcast.message;
1818

19-
import org.springframework.util.Assert;
19+
import org.jspecify.annotations.Nullable;
2020

2121
/**
2222
* Hazelcast Message Payload for Entry Events.
@@ -28,59 +28,11 @@
2828
* @author Artem Bilan
2929
*
3030
* @since 6.0
31+
*
32+
* @param key The entry key.
33+
* @param value The entry value.
34+
* @param oldValue The entry old value if any.
3135
*/
32-
public class EntryEventMessagePayload<K, V> {
33-
34-
/**
35-
* The entry key.
36-
*/
37-
public final K key;
38-
39-
/**
40-
* The entry value.
41-
*/
42-
public final V value;
43-
44-
/**
45-
* The entry old value if any.
46-
*/
47-
public final V oldValue;
48-
49-
public EntryEventMessagePayload(final K key, final V value, final V oldValue) {
50-
Assert.notNull(key, "'key' must not be null");
51-
this.key = key;
52-
this.value = value;
53-
this.oldValue = oldValue;
54-
}
55-
56-
@Override
57-
public String toString() {
58-
return "EntryEventMessagePayload [key=" + this.key + ", value=" + this.value + ", oldValue=" + this.oldValue + "]";
59-
}
60-
61-
@Override
62-
public boolean equals(Object o) {
63-
if (this == o) {
64-
return true;
65-
}
66-
if (o == null || getClass() != o.getClass()) {
67-
return false;
68-
}
69-
70-
EntryEventMessagePayload<?, ?> that = (EntryEventMessagePayload<?, ?>) o;
71-
72-
return this.key.equals(that.key) && !(this.value != null ? !this.value.equals(that.value)
73-
: that.value != null) && !(this.oldValue != null
74-
? !this.oldValue.equals(that.oldValue) : that.oldValue != null);
75-
76-
}
77-
78-
@Override
79-
public int hashCode() {
80-
int result = this.key.hashCode();
81-
result = 31 * result + (this.value != null ? this.value.hashCode() : 0);
82-
result = 31 * result + (this.oldValue != null ? this.oldValue.hashCode() : 0);
83-
return result;
84-
}
36+
public record EntryEventMessagePayload<K, V>(K key, @Nullable V value, @Nullable V oldValue) {
8537

8638
}
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
/**
22
* Provides classes supporting Hazelcast message headers and payload.
33
*/
4+
@org.jspecify.annotations.NullMarked
45
package org.springframework.integration.hazelcast.message;

spring-integration-hazelcast/src/test/java/org/springframework/integration/hazelcast/inbound/HazelcastCQDistributedMapInboundChannelAdapterTests.java

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -97,13 +97,13 @@ public void testContinuousQueryForOnlyREMOVEDEntryEvent() {
9797
assertThat(msg.getHeaders().get(HazelcastHeaders.CACHE_NAME)).isEqualTo("cqDistributedMap2");
9898

9999
assertThat(((EntryEventMessagePayload<Integer, HazelcastIntegrationTestUser>) msg
100-
.getPayload()).key).isEqualTo(Integer.valueOf(2));
100+
.getPayload()).key()).isEqualTo(Integer.valueOf(2));
101101
assertThat((((EntryEventMessagePayload<Integer, HazelcastIntegrationTestUser>) msg
102-
.getPayload()).oldValue).getId()).isEqualTo(2);
102+
.getPayload()).oldValue()).getId()).isEqualTo(2);
103103
assertThat((((EntryEventMessagePayload<Integer, HazelcastIntegrationTestUser>) msg
104-
.getPayload()).oldValue).getName()).isEqualTo("TestName2");
104+
.getPayload()).oldValue()).getName()).isEqualTo("TestName2");
105105
assertThat((((EntryEventMessagePayload<Integer, HazelcastIntegrationTestUser>) msg
106-
.getPayload()).oldValue).getSurname()).isEqualTo("TestSurname2");
106+
.getPayload()).oldValue()).getSurname()).isEqualTo("TestSurname2");
107107
}
108108

109109
@Test
@@ -129,19 +129,19 @@ public void testContinuousQueryForOnlyUPDATEDEntryEvent() {
129129
assertThat(msg.getHeaders().get(HazelcastHeaders.CACHE_NAME)).isEqualTo("cqDistributedMap4");
130130

131131
assertThat(((EntryEventMessagePayload<Integer, HazelcastIntegrationTestUser>) msg
132-
.getPayload()).key).isEqualTo(Integer.valueOf(1));
132+
.getPayload()).key()).isEqualTo(Integer.valueOf(1));
133133
assertThat((((EntryEventMessagePayload<Integer, HazelcastIntegrationTestUser>) msg
134-
.getPayload()).oldValue).getId()).isEqualTo(1);
134+
.getPayload()).oldValue()).getId()).isEqualTo(1);
135135
assertThat((((EntryEventMessagePayload<Integer, HazelcastIntegrationTestUser>) msg
136-
.getPayload()).oldValue).getName()).isEqualTo("TestName1");
136+
.getPayload()).oldValue()).getName()).isEqualTo("TestName1");
137137
assertThat((((EntryEventMessagePayload<Integer, HazelcastIntegrationTestUser>) msg
138-
.getPayload()).oldValue).getSurname()).isEqualTo("TestSurname1");
138+
.getPayload()).oldValue()).getSurname()).isEqualTo("TestSurname1");
139139
assertThat((((EntryEventMessagePayload<Integer, HazelcastIntegrationTestUser>) msg
140-
.getPayload()).value).getId()).isEqualTo(2);
140+
.getPayload()).value()).getId()).isEqualTo(2);
141141
assertThat((((EntryEventMessagePayload<Integer, HazelcastIntegrationTestUser>) msg
142-
.getPayload()).value).getName()).isEqualTo("TestName2");
142+
.getPayload()).value()).getName()).isEqualTo("TestName2");
143143
assertThat((((EntryEventMessagePayload<Integer, HazelcastIntegrationTestUser>) msg
144-
.getPayload()).value).getSurname()).isEqualTo("TestSurname2");
144+
.getPayload()).value()).getSurname()).isEqualTo("TestSurname2");
145145
}
146146

147147
@Test

spring-integration-hazelcast/src/test/java/org/springframework/integration/hazelcast/inbound/HazelcastDistributedMapEventDrivenInboundChannelAdapterTests.java

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -92,19 +92,19 @@ public void testEventDrivenForOnlyUPDATEDEntryEvent() {
9292
assertThat(msg.getHeaders().get(HazelcastHeaders.CACHE_NAME)).isEqualTo("edDistributedMap2");
9393

9494
assertThat(((EntryEventMessagePayload<Integer, HazelcastIntegrationTestUser>) msg
95-
.getPayload()).key).isEqualTo(Integer.valueOf(2));
95+
.getPayload()).key()).isEqualTo(Integer.valueOf(2));
9696
assertThat((((EntryEventMessagePayload<Integer, HazelcastIntegrationTestUser>) msg
97-
.getPayload()).oldValue).getId()).isEqualTo(1);
97+
.getPayload()).oldValue()).getId()).isEqualTo(1);
9898
assertThat((((EntryEventMessagePayload<Integer, HazelcastIntegrationTestUser>) msg
99-
.getPayload()).oldValue).getName()).isEqualTo("TestName1");
99+
.getPayload()).oldValue()).getName()).isEqualTo("TestName1");
100100
assertThat((((EntryEventMessagePayload<Integer, HazelcastIntegrationTestUser>) msg
101-
.getPayload()).oldValue).getSurname()).isEqualTo("TestSurname1");
101+
.getPayload()).oldValue()).getSurname()).isEqualTo("TestSurname1");
102102
assertThat((((EntryEventMessagePayload<Integer, HazelcastIntegrationTestUser>) msg
103-
.getPayload()).value).getId()).isEqualTo(2);
103+
.getPayload()).value()).getId()).isEqualTo(2);
104104
assertThat((((EntryEventMessagePayload<Integer, HazelcastIntegrationTestUser>) msg
105-
.getPayload()).value).getName()).isEqualTo("TestName2");
105+
.getPayload()).value()).getName()).isEqualTo("TestName2");
106106
assertThat((((EntryEventMessagePayload<Integer, HazelcastIntegrationTestUser>) msg
107-
.getPayload()).value).getSurname()).isEqualTo("TestSurname2");
107+
.getPayload()).value()).getSurname()).isEqualTo("TestSurname2");
108108
}
109109

110110
@Test
@@ -124,13 +124,13 @@ public void testEventDrivenForOnlyREMOVEDEntryEvent() {
124124
assertThat(msg.getHeaders().get(HazelcastHeaders.CACHE_NAME)).isEqualTo("edDistributedMap3");
125125

126126
assertThat(((EntryEventMessagePayload<Integer, HazelcastIntegrationTestUser>) msg
127-
.getPayload()).key).isEqualTo(Integer.valueOf(2));
127+
.getPayload()).key()).isEqualTo(Integer.valueOf(2));
128128
assertThat((((EntryEventMessagePayload<Integer, HazelcastIntegrationTestUser>) msg
129-
.getPayload()).oldValue).getId()).isEqualTo(2);
129+
.getPayload()).oldValue()).getId()).isEqualTo(2);
130130
assertThat((((EntryEventMessagePayload<Integer, HazelcastIntegrationTestUser>) msg
131-
.getPayload()).oldValue).getName()).isEqualTo("TestName2");
131+
.getPayload()).oldValue()).getName()).isEqualTo("TestName2");
132132
assertThat((((EntryEventMessagePayload<Integer, HazelcastIntegrationTestUser>) msg
133-
.getPayload()).oldValue).getSurname()).isEqualTo("TestSurname2");
133+
.getPayload()).oldValue()).getSurname()).isEqualTo("TestSurname2");
134134
}
135135

136136
@Test

spring-integration-hazelcast/src/test/java/org/springframework/integration/hazelcast/inbound/HazelcastMultiMapEventDrivenInboundChannelAdapterTests.java

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -77,13 +77,13 @@ public void testEventDrivenForOnlyADDEDEntryEvent() {
7777
assertThat(msg.getHeaders().get(HazelcastHeaders.CACHE_NAME)).isEqualTo("edMultiMap1");
7878

7979
assertThat(((EntryEventMessagePayload<Integer, HazelcastIntegrationTestUser>) msg
80-
.getPayload()).key).isEqualTo(Integer.valueOf(1));
80+
.getPayload()).key()).isEqualTo(Integer.valueOf(1));
8181
assertThat((((EntryEventMessagePayload<Integer, HazelcastIntegrationTestUser>) msg
82-
.getPayload()).value).getId()).isEqualTo(1);
82+
.getPayload()).value()).getId()).isEqualTo(1);
8383
assertThat((((EntryEventMessagePayload<Integer, HazelcastIntegrationTestUser>) msg
84-
.getPayload()).value).getName()).isEqualTo("TestName1");
84+
.getPayload()).value()).getName()).isEqualTo("TestName1");
8585
assertThat((((EntryEventMessagePayload<Integer, HazelcastIntegrationTestUser>) msg
86-
.getPayload()).value).getSurname()).isEqualTo("TestSurname1");
86+
.getPayload()).value()).getSurname()).isEqualTo("TestSurname1");
8787
}
8888

8989
@Test
@@ -103,14 +103,14 @@ public void testEventDrivenForOnlyREMOVEDEntryEvent() {
103103
assertThat(msg.getHeaders().get(HazelcastHeaders.CACHE_NAME)).isEqualTo("edMultiMap2");
104104

105105
assertThat(((EntryEventMessagePayload<Integer, HazelcastIntegrationTestUser>) msg
106-
.getPayload()).key).isEqualTo(Integer.valueOf(2));
107-
assertThat(((EntryEventMessagePayload<?, ?>) msg.getPayload()).value).isNull();
106+
.getPayload()).key()).isEqualTo(Integer.valueOf(2));
107+
assertThat(((EntryEventMessagePayload<?, ?>) msg.getPayload()).value()).isNull();
108108
assertThat((((EntryEventMessagePayload<Integer, HazelcastIntegrationTestUser>) msg
109-
.getPayload()).oldValue).getId()).isEqualTo(2);
109+
.getPayload()).oldValue()).getId()).isEqualTo(2);
110110
assertThat((((EntryEventMessagePayload<Integer, HazelcastIntegrationTestUser>) msg
111-
.getPayload()).oldValue).getName()).isEqualTo("TestName2");
111+
.getPayload()).oldValue()).getName()).isEqualTo("TestName2");
112112
assertThat((((EntryEventMessagePayload<Integer, HazelcastIntegrationTestUser>) msg
113-
.getPayload()).oldValue).getSurname()).isEqualTo("TestSurname2");
113+
.getPayload()).oldValue()).getSurname()).isEqualTo("TestSurname2");
114114
}
115115

116116
@Test

spring-integration-hazelcast/src/test/java/org/springframework/integration/hazelcast/inbound/HazelcastReplicatedMapEventDrivenInboundChannelAdapterTests.java

Lines changed: 15 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -83,13 +83,13 @@ public void testEventDrivenForOnlyADDEDEntryEvent() {
8383
assertThat(msg.getHeaders().get(HazelcastHeaders.CACHE_NAME)).isEqualTo("edReplicatedMap1");
8484

8585
assertThat(((EntryEventMessagePayload<Integer, HazelcastIntegrationTestUser>) msg
86-
.getPayload()).key).isEqualTo(Integer.valueOf(1));
86+
.getPayload()).key()).isEqualTo(Integer.valueOf(1));
8787
assertThat((((EntryEventMessagePayload<Integer, HazelcastIntegrationTestUser>) msg
88-
.getPayload()).value).getId()).isEqualTo(1);
88+
.getPayload()).value()).getId()).isEqualTo(1);
8989
assertThat((((EntryEventMessagePayload<Integer, HazelcastIntegrationTestUser>) msg
90-
.getPayload()).value).getName()).isEqualTo("TestName1");
90+
.getPayload()).value()).getName()).isEqualTo("TestName1");
9191
assertThat((((EntryEventMessagePayload<Integer, HazelcastIntegrationTestUser>) msg
92-
.getPayload()).value).getSurname()).isEqualTo("TestSurname1");
92+
.getPayload()).value()).getSurname()).isEqualTo("TestSurname1");
9393
}
9494

9595
@Test
@@ -109,19 +109,19 @@ public void testEventDrivenForOnlyUPDATEDEntryEvent() {
109109
assertThat(msg.getHeaders().get(HazelcastHeaders.CACHE_NAME)).isEqualTo("edReplicatedMap2");
110110

111111
assertThat(((EntryEventMessagePayload<Integer, HazelcastIntegrationTestUser>) msg
112-
.getPayload()).key).isEqualTo(Integer.valueOf(2));
112+
.getPayload()).key()).isEqualTo(Integer.valueOf(2));
113113
assertThat((((EntryEventMessagePayload<Integer, HazelcastIntegrationTestUser>) msg
114-
.getPayload()).oldValue).getId()).isEqualTo(1);
114+
.getPayload()).oldValue()).getId()).isEqualTo(1);
115115
assertThat((((EntryEventMessagePayload<Integer, HazelcastIntegrationTestUser>) msg
116-
.getPayload()).oldValue).getName()).isEqualTo("TestName1");
116+
.getPayload()).oldValue()).getName()).isEqualTo("TestName1");
117117
assertThat((((EntryEventMessagePayload<Integer, HazelcastIntegrationTestUser>) msg
118-
.getPayload()).oldValue).getSurname()).isEqualTo("TestSurname1");
118+
.getPayload()).oldValue()).getSurname()).isEqualTo("TestSurname1");
119119
assertThat((((EntryEventMessagePayload<Integer, HazelcastIntegrationTestUser>) msg
120-
.getPayload()).value).getId()).isEqualTo(2);
120+
.getPayload()).value()).getId()).isEqualTo(2);
121121
assertThat((((EntryEventMessagePayload<Integer, HazelcastIntegrationTestUser>) msg
122-
.getPayload()).value).getName()).isEqualTo("TestName2");
122+
.getPayload()).value()).getName()).isEqualTo("TestName2");
123123
assertThat((((EntryEventMessagePayload<Integer, HazelcastIntegrationTestUser>) msg
124-
.getPayload()).value).getSurname()).isEqualTo("TestSurname2");
124+
.getPayload()).value()).getSurname()).isEqualTo("TestSurname2");
125125
}
126126

127127
@Test
@@ -141,13 +141,13 @@ public void testEventDrivenForOnlyREMOVEDEntryEvent() {
141141
assertThat(msg.getHeaders().get(HazelcastHeaders.CACHE_NAME)).isEqualTo("edReplicatedMap3");
142142

143143
assertThat(((EntryEventMessagePayload<Integer, HazelcastIntegrationTestUser>) msg
144-
.getPayload()).key).isEqualTo(Integer.valueOf(2));
144+
.getPayload()).key()).isEqualTo(Integer.valueOf(2));
145145
assertThat((((EntryEventMessagePayload<Integer, HazelcastIntegrationTestUser>) msg
146-
.getPayload()).oldValue).getId()).isEqualTo(2);
146+
.getPayload()).oldValue()).getId()).isEqualTo(2);
147147
assertThat((((EntryEventMessagePayload<Integer, HazelcastIntegrationTestUser>) msg
148-
.getPayload()).oldValue).getName()).isEqualTo("TestName2");
148+
.getPayload()).oldValue()).getName()).isEqualTo("TestName2");
149149
assertThat((((EntryEventMessagePayload<Integer, HazelcastIntegrationTestUser>) msg
150-
.getPayload()).oldValue).getSurname()).isEqualTo("TestSurname2");
150+
.getPayload()).oldValue()).getSurname()).isEqualTo("TestSurname2");
151151
}
152152

153153
@Test

spring-integration-hazelcast/src/test/java/org/springframework/integration/hazelcast/inbound/util/HazelcastInboundChannelAdapterTestUtils.java

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -88,13 +88,13 @@ public static void testEventDrivenForADDEDDistributedMapEntryEvent(
8888
assertThat(msg.getHeaders().get(HazelcastHeaders.CACHE_NAME)).isEqualTo(cacheName);
8989

9090
assertThat(((EntryEventMessagePayload<Integer, HazelcastIntegrationTestUser>) msg
91-
.getPayload()).key).isEqualTo(Integer.valueOf(1));
91+
.getPayload()).key()).isEqualTo(Integer.valueOf(1));
9292
assertThat((((EntryEventMessagePayload<Integer, HazelcastIntegrationTestUser>) msg
93-
.getPayload()).value).getId()).isEqualTo(1);
93+
.getPayload()).value()).getId()).isEqualTo(1);
9494
assertThat((((EntryEventMessagePayload<Integer, HazelcastIntegrationTestUser>) msg
95-
.getPayload()).value).getName()).isEqualTo("TestName1");
95+
.getPayload()).value()).getName()).isEqualTo("TestName1");
9696
assertThat((((EntryEventMessagePayload<Integer, HazelcastIntegrationTestUser>) msg
97-
.getPayload()).value).getSurname()).isEqualTo("TestSurname1");
97+
.getPayload()).value()).getSurname()).isEqualTo("TestSurname1");
9898
}
9999

100100
public static void testEventDrivenForDistributedMapEntryEvents(
@@ -223,11 +223,11 @@ public static void testContinuousQueryForUPDATEDEntryEventWhenIncludeValueIsFals
223223
assertThat(msg.getHeaders().get(HazelcastHeaders.CACHE_NAME)).isEqualTo(cacheName);
224224

225225
assertThat(((EntryEventMessagePayload<Integer, HazelcastIntegrationTestUser>) msg
226-
.getPayload()).key).isEqualTo(Integer.valueOf(1));
226+
.getPayload()).key()).isEqualTo(Integer.valueOf(1));
227227
assertThat(((EntryEventMessagePayload<Integer, HazelcastIntegrationTestUser>) msg
228-
.getPayload()).oldValue).isNull();
228+
.getPayload()).oldValue()).isNull();
229229
assertThat(((EntryEventMessagePayload<Integer, HazelcastIntegrationTestUser>) msg
230-
.getPayload()).value).isNull();
230+
.getPayload()).value()).isNull();
231231
}
232232

233233
public static void testDistributedSQLForENTRYIterationType(

spring-integration-jpa/src/main/java/org/springframework/integration/jpa/support/parametersource/BeanPropertyParameterSource.java

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -18,8 +18,11 @@
1818

1919
import java.beans.PropertyDescriptor;
2020
import java.util.ArrayList;
21+
import java.util.Arrays;
2122
import java.util.List;
2223

24+
import org.jspecify.annotations.Nullable;
25+
2326
import org.springframework.beans.BeanWrapper;
2427
import org.springframework.beans.NotReadablePropertyException;
2528
import org.springframework.beans.PropertyAccessorFactory;
@@ -29,6 +32,7 @@
2932
* @author Gunnar Hillert
3033
* @author Gary Russell
3134
* @author Ngoc Nhan
35+
* @author Artem Bilan
3236
*
3337
* @since 2.2
3438
*
@@ -37,7 +41,7 @@ public class BeanPropertyParameterSource implements ParameterSource {
3741

3842
private final BeanWrapper beanWrapper;
3943

40-
private String[] propertyNames;
44+
private String @Nullable [] propertyNames;
4145

4246
/**
4347
* Create a new BeanPropertySqlParameterSource for the given bean.
@@ -53,19 +57,18 @@ public boolean hasValue(String paramName) {
5357
}
5458

5559
@Override
56-
public Object getValue(String paramName) {
60+
public @Nullable Object getValue(String paramName) {
5761
try {
5862
return this.beanWrapper.getPropertyValue(paramName);
5963
}
6064
catch (NotReadablePropertyException ex) {
61-
throw new IllegalArgumentException(ex.getMessage()); // NOSONAR - lost stack trace
65+
throw new IllegalArgumentException(ex.getMessage());
6266
}
6367
}
6468

6569
/**
6670
* Provide access to the property names of the wrapped bean.
67-
* Uses support provided in the {@link org.springframework.beans.PropertyAccessor}
68-
* interface.
71+
* Uses support provided in the {@link org.springframework.beans.PropertyAccessor} interface.
6972
* @return an array containing all the known property names
7073
*/
7174
public String[] getReadablePropertyNames() {
@@ -77,9 +80,9 @@ public String[] getReadablePropertyNames() {
7780
names.add(pd.getName());
7881
}
7982
}
80-
this.propertyNames = names.toArray(new String[names.size()]);
83+
this.propertyNames = names.toArray(new String[0]);
8184
}
82-
return this.propertyNames; // NOSONAR - expose internals
85+
return Arrays.copyOf(this.propertyNames, this.propertyNames.length);
8386
}
8487

8588
}

0 commit comments

Comments
 (0)