From 869cbd3e71a04233b216b0d1b1c762bf3aca781c Mon Sep 17 00:00:00 2001
From: Goutam Adwant <8672451+goutamadwant@users.noreply.github.com>
Date: Fri, 3 Jul 2026 06:50:59 -0700
Subject: [PATCH] Allow anonymous WS-Addressing replies without MessageID
Signed-off-by: Goutam Adwant <8672451+goutamadwant@users.noreply.github.com>
---
.../soap/addressing/version/Addressing10.java | 7 ++-
.../server/AddressingInterceptor10Tests.java | 48 +++++++++++++++++++
.../10/request-anonymous-no-message-id.xml | 15 ++++++
.../10/request-no-reply-to-no-message-id.xml | 11 +++++
.../10/request-none-no-message-id.xml | 15 ++++++
5 files changed, 95 insertions(+), 1 deletion(-)
create mode 100644 spring-ws-core/src/test/resources/org/springframework/ws/soap/addressing/10/request-anonymous-no-message-id.xml
create mode 100644 spring-ws-core/src/test/resources/org/springframework/ws/soap/addressing/10/request-no-reply-to-no-message-id.xml
create mode 100644 spring-ws-core/src/test/resources/org/springframework/ws/soap/addressing/10/request-none-no-message-id.xml
diff --git a/spring-ws-core/src/main/java/org/springframework/ws/soap/addressing/version/Addressing10.java b/spring-ws-core/src/main/java/org/springframework/ws/soap/addressing/version/Addressing10.java
index 9063e0f11..8fb7b6bf0 100644
--- a/spring-ws-core/src/main/java/org/springframework/ws/soap/addressing/version/Addressing10.java
+++ b/spring-ws-core/src/main/java/org/springframework/ws/soap/addressing/version/Addressing10.java
@@ -52,13 +52,18 @@ public boolean hasRequiredProperties(MessageAddressingProperties map) {
if (map.getAction() == null) {
return false;
}
- if (map.getReplyTo() != null || map.getFaultTo() != null) {
+ if (requiresMessageId(map.getReplyTo()) || requiresMessageId(map.getFaultTo())) {
return map.getMessageId() != null;
}
return true;
}
+ private boolean requiresMessageId(@Nullable EndpointReference endpointReference) {
+ return endpointReference != null && !hasAnonymousAddress(endpointReference)
+ && !hasNoneAddress(endpointReference);
+ }
+
@Override
public boolean isToHeaderRequired() {
return false;
diff --git a/spring-ws-core/src/test/java/org/springframework/ws/soap/addressing/server/AddressingInterceptor10Tests.java b/spring-ws-core/src/test/java/org/springframework/ws/soap/addressing/server/AddressingInterceptor10Tests.java
index 9b43bc88e..0004207bf 100644
--- a/spring-ws-core/src/test/java/org/springframework/ws/soap/addressing/server/AddressingInterceptor10Tests.java
+++ b/spring-ws-core/src/test/java/org/springframework/ws/soap/addressing/server/AddressingInterceptor10Tests.java
@@ -65,4 +65,52 @@ void testNoTo() throws Exception {
verify(this.strategyMock);
}
+ @Test
+ void testAnonymousReplyToWithoutMessageId() throws Exception {
+
+ SaajSoapMessage valid = loadSaajMessage(getTestPath() + "/request-anonymous-no-message-id.xml");
+ MessageContext context = new DefaultMessageContext(valid, new SaajSoapMessageFactory(this.messageFactory));
+ expect(this.strategyMock.isDuplicate(null)).andReturn(false);
+ replay(this.strategyMock);
+
+ boolean result = this.interceptor.handleRequest(context, null);
+
+ assertThat(result).isTrue();
+ assertThat(context.hasResponse()).isFalse();
+
+ verify(this.strategyMock);
+ }
+
+ @Test
+ void testNoReplyToWithoutMessageId() throws Exception {
+
+ SaajSoapMessage valid = loadSaajMessage(getTestPath() + "/request-no-reply-to-no-message-id.xml");
+ MessageContext context = new DefaultMessageContext(valid, new SaajSoapMessageFactory(this.messageFactory));
+ expect(this.strategyMock.isDuplicate(null)).andReturn(false);
+ replay(this.strategyMock);
+
+ boolean result = this.interceptor.handleRequest(context, null);
+
+ assertThat(result).isTrue();
+ assertThat(context.hasResponse()).isFalse();
+
+ verify(this.strategyMock);
+ }
+
+ @Test
+ void testNoneReplyToWithoutMessageId() throws Exception {
+
+ SaajSoapMessage valid = loadSaajMessage(getTestPath() + "/request-none-no-message-id.xml");
+ MessageContext context = new DefaultMessageContext(valid, new SaajSoapMessageFactory(this.messageFactory));
+ expect(this.strategyMock.isDuplicate(null)).andReturn(false);
+ replay(this.strategyMock);
+
+ boolean result = this.interceptor.handleRequest(context, null);
+
+ assertThat(result).isTrue();
+ assertThat(context.hasResponse()).isFalse();
+
+ verify(this.strategyMock);
+ }
+
}
diff --git a/spring-ws-core/src/test/resources/org/springframework/ws/soap/addressing/10/request-anonymous-no-message-id.xml b/spring-ws-core/src/test/resources/org/springframework/ws/soap/addressing/10/request-anonymous-no-message-id.xml
new file mode 100644
index 000000000..843590c79
--- /dev/null
+++ b/spring-ws-core/src/test/resources/org/springframework/ws/soap/addressing/10/request-anonymous-no-message-id.xml
@@ -0,0 +1,15 @@
+
+
+
+ http://www.w3.org/2005/08/addressing/anonymous
+
+ mailto:fabrikam@example.com
+ http://example.com/fabrikam/mail/Delete
+
+
+
+ 42
+
+
+
diff --git a/spring-ws-core/src/test/resources/org/springframework/ws/soap/addressing/10/request-no-reply-to-no-message-id.xml b/spring-ws-core/src/test/resources/org/springframework/ws/soap/addressing/10/request-no-reply-to-no-message-id.xml
new file mode 100644
index 000000000..910f648ab
--- /dev/null
+++ b/spring-ws-core/src/test/resources/org/springframework/ws/soap/addressing/10/request-no-reply-to-no-message-id.xml
@@ -0,0 +1,11 @@
+
+
+ http://example.com/fabrikam/mail/Delete
+
+
+
+ 42
+
+
+
diff --git a/spring-ws-core/src/test/resources/org/springframework/ws/soap/addressing/10/request-none-no-message-id.xml b/spring-ws-core/src/test/resources/org/springframework/ws/soap/addressing/10/request-none-no-message-id.xml
new file mode 100644
index 000000000..d8b41ca46
--- /dev/null
+++ b/spring-ws-core/src/test/resources/org/springframework/ws/soap/addressing/10/request-none-no-message-id.xml
@@ -0,0 +1,15 @@
+
+
+
+ http://www.w3.org/2005/08/addressing/none
+
+ mailto:fabrikam@example.com
+ http://example.com/fabrikam/mail/Delete
+
+
+
+ 42
+
+
+