This is an automated email from the ASF dual-hosted git repository.

davsclaus pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/camel.git


The following commit(s) were added to refs/heads/main by this push:
     new 13612075142 Convert JAXBElement<X> to X (#11553)
13612075142 is described below

commit 1361207514269931c3dc86499e71aea452886436
Author: Adriano Machado <60320+ammach...@users.noreply.github.com>
AuthorDate: Tue Sep 26 07:28:40 2023 -0400

    Convert JAXBElement<X> to X (#11553)
    
    Co-authored-by: Adriano Machado <admac...@redhat.com>
---
 .../converter/jaxb/FallbackTypeConverter.java      |  8 +++
 .../jaxb/JAXBElementFallbackTypeConverterTest.java | 63 ++++++++++++++++++++++
 2 files changed, 71 insertions(+)

diff --git 
a/components/camel-jaxb/src/main/java/org/apache/camel/converter/jaxb/FallbackTypeConverter.java
 
b/components/camel-jaxb/src/main/java/org/apache/camel/converter/jaxb/FallbackTypeConverter.java
index c3ff446b71b..5b9d9f6b3ee 100644
--- 
a/components/camel-jaxb/src/main/java/org/apache/camel/converter/jaxb/FallbackTypeConverter.java
+++ 
b/components/camel-jaxb/src/main/java/org/apache/camel/converter/jaxb/FallbackTypeConverter.java
@@ -181,6 +181,14 @@ public class FallbackTypeConverter {
             throw new IllegalArgumentException("Cannot convert from null value 
to JAXBSource");
         }
 
+        // Check if the object is a JAXBElement of the correct type
+        if (value instanceof JAXBElement) {
+            JAXBElement<?> jaxbElement = (JAXBElement<?>) value;
+            if (type.isAssignableFrom(jaxbElement.getDeclaredType())) {
+                return castJaxbType(jaxbElement, type);
+            }
+        }
+
         Unmarshaller unmarshaller = getUnmarshaller(type);
 
         if (converter != null) {
diff --git 
a/components/camel-jaxb/src/test/java/org/apache/camel/converter/jaxb/JAXBElementFallbackTypeConverterTest.java
 
b/components/camel-jaxb/src/test/java/org/apache/camel/converter/jaxb/JAXBElementFallbackTypeConverterTest.java
new file mode 100644
index 00000000000..6da9ec2df12
--- /dev/null
+++ 
b/components/camel-jaxb/src/test/java/org/apache/camel/converter/jaxb/JAXBElementFallbackTypeConverterTest.java
@@ -0,0 +1,63 @@
+/*
+ * 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.converter.jaxb;
+
+import jakarta.xml.bind.JAXBElement;
+
+import javax.xml.namespace.QName;
+
+import org.apache.camel.Message;
+import org.apache.camel.builder.RouteBuilder;
+import org.apache.camel.converter.jaxb.person.Person;
+import org.apache.camel.test.junit5.CamelTestSupport;
+import org.junit.jupiter.api.Test;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertNotNull;
+
+public class JAXBElementFallbackTypeConverterTest extends CamelTestSupport {
+
+    @Test
+    void testJaxbFallbackTypeConverter() {
+        Person person = new Person();
+        person.setFirstName("Apache");
+        person.setLastName("Camel");
+
+        QName qName = new QName("person.jaxb.converter.camel.apache.org", 
"person");
+        JAXBElement<Person> personElement = new JAXBElement<>(qName, 
Person.class, person);
+
+        Person result = template.requestBody("direct:start", personElement, 
Person.class);
+        assertNotNull(result);
+        assertEquals(person.getFirstName(), result.getFirstName());
+        assertEquals(person.getLastName(), result.getLastName());
+    }
+
+    @Override
+    protected RouteBuilder createRouteBuilder() {
+
+        return new RouteBuilder() {
+            @Override
+            public void configure() {
+                from("direct:start").process(exchange -> {
+                    Message in = exchange.getIn();
+                    Person body = in.getMandatoryBody(Person.class);
+                    exchange.getMessage().setBody(body);
+                });
+            }
+        };
+    }
+}

Reply via email to