This is an automated email from the ASF dual-hosted git repository.
oscerd pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/camel-spring-boot.git
The following commit(s) were added to refs/heads/main by this push:
new de757395942 CAMEL-25590: camel-lra-starter - expose the callbackSecret
and allowedCoordinatorUrls options (#2038)
de757395942 is described below
commit de7573959421e2257f4a044f949a7d895ccb7785
Author: Andrea Cosentino <[email protected]>
AuthorDate: Thu Oct 15 15:21:53 2026 +0200
CAMEL-25590: camel-lra-starter - expose the callbackSecret and
allowedCoordinatorUrls options (#2038)
The LRA saga service gained the callbackSecret (CAMEL-25578) and
allowedCoordinatorUrls (CAMEL-25584) options, which camel-main exposes as
camel.lra.callback-secret and camel.lra.allowed-coordinator-urls. The Spring
Boot starter creates the LRASagaService from its own configuration class, so
neither option could be set through Spring Boot properties.
Add both properties to LraServiceConfiguration, pass them to the service in
LraServiceAutoConfiguration, and add an auto-configuration test. The test
needs the servlet API on its classpath because the starter depends on
camel-servlet-starter, so spring-boot-starter-web is added with test scope,
as camel-servlet-starter does.
Signed-off-by: Andrea Cosentino <[email protected]>
Co-authored-by: Claude Opus 5.5 <[email protected]>
---
components-starter/camel-lra-starter/pom.xml | 6 +++
.../camel-lra-starter/src/main/docs/lra.json | 12 +++++
.../springboot/LraServiceAutoConfiguration.java | 2 +
.../lra/springboot/LraServiceConfiguration.java | 30 +++++++++++
.../LraServiceAutoConfigurationTest.java | 58 ++++++++++++++++++++++
.../modules/ROOT/pages/starters/lra.adoc | 4 +-
6 files changed, 111 insertions(+), 1 deletion(-)
diff --git a/components-starter/camel-lra-starter/pom.xml
b/components-starter/camel-lra-starter/pom.xml
index eb737494a89..8d4ee55c067 100644
--- a/components-starter/camel-lra-starter/pom.xml
+++ b/components-starter/camel-lra-starter/pom.xml
@@ -43,6 +43,12 @@
<groupId>org.apache.camel.springboot</groupId>
<artifactId>camel-servlet-starter</artifactId>
</dependency>
+ <dependency>
+ <groupId>org.springframework.boot</groupId>
+ <artifactId>spring-boot-starter-web</artifactId>
+ <version>${spring-boot-version}</version>
+ <scope>test</scope>
+ </dependency>
<!--START OF GENERATED CODE-->
<dependency>
<groupId>org.apache.camel.springboot</groupId>
diff --git a/components-starter/camel-lra-starter/src/main/docs/lra.json
b/components-starter/camel-lra-starter/src/main/docs/lra.json
index c46b5eecd45..73efa8efaa6 100644
--- a/components-starter/camel-lra-starter/src/main/docs/lra.json
+++ b/components-starter/camel-lra-starter/src/main/docs/lra.json
@@ -7,6 +7,18 @@
}
],
"properties": [
+ {
+ "name": "camel.lra.allowed-coordinator-urls",
+ "type": "java.lang.String",
+ "description": "Comma-separated URLs, including the context path, of
further LRA coordinators whose LRAs may be joined, completed or compensated. By
default, only an LRA hosted by the configured coordinator is accepted. Use it
when participants reach the same coordinator under different URLs, for example
with different host names.",
+ "sourceType":
"org.apache.camel.service.lra.springboot.LraServiceConfiguration"
+ },
+ {
+ "name": "camel.lra.callback-secret",
+ "type": "java.lang.String",
+ "description": "Secret used to sign the participant callback URLs that
are enlisted with the LRA coordinator, and to verify them when the coordinator
calls back. When set, a compensation or completion callback with a missing or
invalid signature is rejected with HTTP 403. All the instances of a participant
must use the same secret.",
+ "sourceType":
"org.apache.camel.service.lra.springboot.LraServiceConfiguration"
+ },
{
"name": "camel.lra.coordinator-context-path",
"type": "java.lang.String",
diff --git
a/components-starter/camel-lra-starter/src/main/java/org/apache/camel/service/lra/springboot/LraServiceAutoConfiguration.java
b/components-starter/camel-lra-starter/src/main/java/org/apache/camel/service/lra/springboot/LraServiceAutoConfiguration.java
index 538b190bc8e..d3c74cb391b 100644
---
a/components-starter/camel-lra-starter/src/main/java/org/apache/camel/service/lra/springboot/LraServiceAutoConfiguration.java
+++
b/components-starter/camel-lra-starter/src/main/java/org/apache/camel/service/lra/springboot/LraServiceAutoConfiguration.java
@@ -57,6 +57,8 @@ public class LraServiceAutoConfiguration {
service.setCoordinatorContextPath(configuration.getCoordinatorContextPath());
service.setLocalParticipantUrl(configuration.getLocalParticipantUrl());
service.setLocalParticipantContextPath(configuration.getLocalParticipantContextPath());
+
service.setAllowedCoordinatorUrls(configuration.getAllowedCoordinatorUrls());
+ service.setCallbackSecret(configuration.getCallbackSecret());
camelContext.addService(service);
return service;
diff --git
a/components-starter/camel-lra-starter/src/main/java/org/apache/camel/service/lra/springboot/LraServiceConfiguration.java
b/components-starter/camel-lra-starter/src/main/java/org/apache/camel/service/lra/springboot/LraServiceConfiguration.java
index ba7bbc1102a..22054718666 100644
---
a/components-starter/camel-lra-starter/src/main/java/org/apache/camel/service/lra/springboot/LraServiceConfiguration.java
+++
b/components-starter/camel-lra-starter/src/main/java/org/apache/camel/service/lra/springboot/LraServiceConfiguration.java
@@ -52,6 +52,20 @@ public class LraServiceConfiguration {
*/
private String localParticipantContextPath =
DEFAULT_LOCAL_PARTICIPANT_CONTEXT_PATH;
+ /**
+ * Comma-separated URLs, including the context path, of further LRA
coordinators whose LRAs may be joined, completed
+ * or compensated. By default, only an LRA hosted by the configured
coordinator is accepted. Use it when
+ * participants reach the same coordinator under different URLs, for
example with different host names.
+ */
+ private String allowedCoordinatorUrls;
+
+ /**
+ * Secret used to sign the participant callback URLs that are enlisted
with the LRA coordinator, and to verify them
+ * when the coordinator calls back. When set, a compensation or completion
callback with a missing or invalid
+ * signature is rejected with HTTP 403. All the instances of a participant
must use the same secret.
+ */
+ private String callbackSecret;
+
public boolean isEnabled() {
return enabled;
}
@@ -91,4 +105,20 @@ public class LraServiceConfiguration {
public void setLocalParticipantContextPath(String
localParticipantContextPath) {
this.localParticipantContextPath = localParticipantContextPath;
}
+
+ public String getAllowedCoordinatorUrls() {
+ return allowedCoordinatorUrls;
+ }
+
+ public void setAllowedCoordinatorUrls(String allowedCoordinatorUrls) {
+ this.allowedCoordinatorUrls = allowedCoordinatorUrls;
+ }
+
+ public String getCallbackSecret() {
+ return callbackSecret;
+ }
+
+ public void setCallbackSecret(String callbackSecret) {
+ this.callbackSecret = callbackSecret;
+ }
}
diff --git
a/components-starter/camel-lra-starter/src/test/java/org/apache/camel/service/lra/springboot/LraServiceAutoConfigurationTest.java
b/components-starter/camel-lra-starter/src/test/java/org/apache/camel/service/lra/springboot/LraServiceAutoConfigurationTest.java
new file mode 100644
index 00000000000..88afa472155
--- /dev/null
+++
b/components-starter/camel-lra-starter/src/test/java/org/apache/camel/service/lra/springboot/LraServiceAutoConfigurationTest.java
@@ -0,0 +1,58 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.service.lra.springboot;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertTrue;
+
+import org.apache.camel.CamelContext;
+import org.apache.camel.service.lra.LRASagaService;
+import org.apache.camel.spring.boot.CamelAutoConfiguration;
+import org.apache.camel.test.spring.junit6.CamelSpringBootTest;
+
+import org.junit.jupiter.api.Test;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.test.annotation.DirtiesContext;
+
+@DirtiesContext
+@CamelSpringBootTest
+@SpringBootTest(classes = { CamelAutoConfiguration.class,
LraServiceAutoConfiguration.class },
+ properties = {
+ "camel.lra.enabled = true",
+ "camel.lra.coordinator-url =
http://lra-coordinator:8080",
+ "camel.lra.local-participant-url =
http://localhost:8080",
+ "camel.lra.allowed-coordinator-urls =
http://lra-coordinator.lra.svc:8080/lra-coordinator",
+ "camel.lra.callback-secret = a-callback-secret" })
+class LraServiceAutoConfigurationTest {
+
+ @Autowired
+ CamelContext context;
+
+ @Autowired
+ LRASagaService sagaService;
+
+ @Test
+ void optionsAreSetOnTheLraSagaService() {
+ assertEquals("http://lra-coordinator:8080",
sagaService.getCoordinatorUrl());
+ assertEquals("http://localhost:8080",
sagaService.getLocalParticipantUrl());
+ assertEquals("http://lra-coordinator.lra.svc:8080/lra-coordinator",
sagaService.getAllowedCoordinatorUrls());
+ assertEquals("a-callback-secret", sagaService.getCallbackSecret());
+ assertTrue(context.hasService(sagaService), "the LRA saga service must
be added to the Camel context");
+ }
+}
diff --git a/docs/spring-boot/modules/ROOT/pages/starters/lra.adoc
b/docs/spring-boot/modules/ROOT/pages/starters/lra.adoc
index 66adfc77515..ca5d75eaaa0 100644
--- a/docs/spring-boot/modules/ROOT/pages/starters/lra.adoc
+++ b/docs/spring-boot/modules/ROOT/pages/starters/lra.adoc
@@ -19,11 +19,13 @@ This starter integrates Camel's Saga EIP with a
https://download.eclipse.org/mic
== Spring Boot Auto-Configuration
-The starter supports 5 options, which are listed below.
+The starter supports 7 options, which are listed below.
[width="100%",cols="2,5,^1,2",options="header"]
|===
| Name | Description | Default | Type
+| camel.lra.allowed-coordinator-urls | Comma-separated URLs, including the
context path, of further LRA coordinators whose LRAs may be joined, completed
or compensated. By default, only an LRA hosted by the configured coordinator is
accepted. Use it when participants reach the same coordinator under different
URLs, for example with different host names. | | String
+| camel.lra.callback-secret | Secret used to sign the participant callback
URLs that are enlisted with the LRA coordinator, and to verify them when the
coordinator calls back. When set, a compensation or completion callback with a
missing or invalid signature is rejected with HTTP 403. All the instances of a
participant must use the same secret. | | String
| camel.lra.coordinator-context-path | The context path of the LRA coordinator
service | | String
| camel.lra.coordinator-url | The base URL of the LRA coordinator service
(e.g. http://lra-host:8080) | | String
| camel.lra.enabled | Global option to enable/disable component
auto-configuration, default is true. | true | Boolean