This is an automated email from the ASF dual-hosted git repository. davsclaus pushed a commit to branch fix/CAMEL-24177 in repository https://gitbox.apache.org/repos/asf/camel.git
commit 3924ec541e7311a4c627b02ff8c4a46fcb996d39 Author: Claus Ibsen <[email protected]> AuthorDate: Mon Jul 20 09:42:25 2026 +0200 CAMEL-24177: camel-cxfrs - Fix contentLanguage latching first request value Co-Authored-By: Claude Opus 4.6 <[email protected]> Signed-off-by: Claus Ibsen <[email protected]> --- .../component/cxf/jaxrs/DefaultCxfRsBinding.java | 33 +++++----------------- .../cxf/jaxrs/DefaultCxfRsBindingTest.java | 33 ++++++++++++++++++++++ 2 files changed, 40 insertions(+), 26 deletions(-) diff --git a/components/camel-cxf/camel-cxf-rest/src/main/java/org/apache/camel/component/cxf/jaxrs/DefaultCxfRsBinding.java b/components/camel-cxf/camel-cxf-rest/src/main/java/org/apache/camel/component/cxf/jaxrs/DefaultCxfRsBinding.java index d7fb394f3933..a100f55fa0c7 100644 --- a/components/camel-cxf/camel-cxf-rest/src/main/java/org/apache/camel/component/cxf/jaxrs/DefaultCxfRsBinding.java +++ b/components/camel-cxf/camel-cxf-rest/src/main/java/org/apache/camel/component/cxf/jaxrs/DefaultCxfRsBinding.java @@ -45,8 +45,6 @@ import org.apache.camel.support.ExchangeHelper; import org.apache.camel.util.ObjectHelper; import org.apache.cxf.helpers.CastUtils; import org.apache.cxf.helpers.HttpHeaderHelper; -import org.apache.cxf.jaxrs.client.AbstractClient; -import org.apache.cxf.jaxrs.client.ClientState; import org.apache.cxf.jaxrs.client.WebClient; import org.apache.cxf.jaxrs.impl.MetadataMap; import org.apache.cxf.jaxrs.model.OperationResourceInfoStack; @@ -64,8 +62,6 @@ public class DefaultCxfRsBinding implements CxfRsBinding, HeaderFilterStrategyAw private HeaderFilterStrategy headerFilterStrategy; - private String contentLanguage; - public DefaultCxfRsBinding() { } @@ -271,30 +267,15 @@ public class DefaultCxfRsBinding implements CxfRsBinding, HeaderFilterStrategyAw contentType = MediaType.WILDCARD; } String contentEncoding = camelMessage.getHeader(CxfConstants.CONTENT_ENCODING, String.class); - if (webClient != null && contentLanguage == null) { - try { - Method getStateMethod = AbstractClient.class.getDeclaredMethod("getState"); - getStateMethod.setAccessible(true); - ClientState clientState = (ClientState) getStateMethod.invoke(webClient); - if (clientState.getRequestHeaders().containsKey(HttpHeaders.CONTENT_LANGUAGE)) { - contentLanguage = clientState.getRequestHeaders() - .getFirst(HttpHeaders.CONTENT_LANGUAGE); - if (contentLanguage != null) { - return Entity.entity(body, new Variant( - MediaType.valueOf(contentType), - // TODO Update once baseline is Java 21 - // Locale.of(contentLanguage), - new Locale(contentLanguage), - contentEncoding)); - } - } - } catch (Exception ex) { - LOG.warn( - "Cannot retrieve CONTENT_LANGUAGE from WebClient. This exception is ignored, and US Locale will be used", - ex); + if (webClient != null) { + String contentLanguage = webClient.getHeaders().getFirst(HttpHeaders.CONTENT_LANGUAGE); + if (contentLanguage != null) { + return Entity.entity(body, new Variant( + MediaType.valueOf(contentType), + new Locale(contentLanguage), + contentEncoding)); } } - contentLanguage = Locale.US.getLanguage(); return Entity.entity(body, new Variant(MediaType.valueOf(contentType), Locale.US, contentEncoding)); } diff --git a/components/camel-cxf/camel-cxf-rest/src/test/java/org/apache/camel/component/cxf/jaxrs/DefaultCxfRsBindingTest.java b/components/camel-cxf/camel-cxf-rest/src/test/java/org/apache/camel/component/cxf/jaxrs/DefaultCxfRsBindingTest.java index e31191391fad..25466ddd5229 100644 --- a/components/camel-cxf/camel-cxf-rest/src/test/java/org/apache/camel/component/cxf/jaxrs/DefaultCxfRsBindingTest.java +++ b/components/camel-cxf/camel-cxf-rest/src/test/java/org/apache/camel/component/cxf/jaxrs/DefaultCxfRsBindingTest.java @@ -20,8 +20,12 @@ import java.util.ArrayList; import java.util.Collections; import java.util.HashMap; import java.util.List; +import java.util.Locale; import java.util.Map; +import jakarta.ws.rs.client.Entity; +import jakarta.ws.rs.core.HttpHeaders; + import org.apache.camel.Exchange; import org.apache.camel.Message; import org.apache.camel.impl.DefaultCamelContext; @@ -29,6 +33,7 @@ import org.apache.camel.support.DefaultExchange; import org.apache.camel.support.DefaultHeaderFilterStrategy; import org.apache.camel.support.DefaultMessage; import org.apache.camel.support.ExchangeHelper; +import org.apache.cxf.jaxrs.client.WebClient; import org.apache.cxf.message.MessageImpl; import org.junit.jupiter.api.Test; @@ -55,6 +60,34 @@ public class DefaultCxfRsBindingTest { assertEquals("UTF-8", charset, "Get a worng charset name"); } + @Test + public void testContentLanguagePerRequest() throws Exception { + DefaultCxfRsBinding binding = new DefaultCxfRsBinding(); + Exchange exchange = new DefaultExchange(context); + Message camelMessage = exchange.getIn(); + camelMessage.setBody("test"); + + WebClient frClient = WebClient.create("http://localhost"); + frClient.header(HttpHeaders.CONTENT_LANGUAGE, "fr"); + Entity<Object> frEntity = binding.bindCamelMessageToRequestEntity("body", camelMessage, exchange, frClient); + assertEquals(Locale.FRENCH, frEntity.getVariant().getLanguage()); + + WebClient deClient = WebClient.create("http://localhost"); + deClient.header(HttpHeaders.CONTENT_LANGUAGE, "de"); + Entity<Object> deEntity = binding.bindCamelMessageToRequestEntity("body", camelMessage, exchange, deClient); + assertEquals(Locale.GERMAN, deEntity.getVariant().getLanguage()); + } + + @Test + public void testContentLanguageDefaultsToUS() throws Exception { + DefaultCxfRsBinding binding = new DefaultCxfRsBinding(); + Exchange exchange = new DefaultExchange(context); + Message camelMessage = exchange.getIn(); + + Entity<Object> entity = binding.bindCamelMessageToRequestEntity("body", camelMessage, exchange, null); + assertEquals(Locale.US, entity.getVariant().getLanguage()); + } + @Test public void testCopyProtocolHeader() { DefaultCxfRsBinding cxfRsBinding = new DefaultCxfRsBinding();
