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

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


The following commit(s) were added to refs/heads/main by this push:
     new af21744e02 CXF-8824: CDI beans produced by @Produces methods are 
generated twice (#1163)
af21744e02 is described below

commit af21744e02a97cc081f3392579238c10d18b7152
Author: Andriy Redko <[email protected]>
AuthorDate: Thu Mar 30 19:17:59 2023 -0400

    CXF-8824: CDI beans produced by @Produces methods are generated twice 
(#1163)
---
 .../apache/cxf/cdi/JAXRSCdiResourceExtension.java  | 10 +++--
 .../cxf/systest/jaxrs/cdi/BookStoreFeed.java       | 12 +++++-
 .../jaxrs/cdi/BookStoreProducerApplication.java    |  9 +++--
 .../jaxrs/cdi/ServerFactoryDebugExtension.java     | 44 ++++++++++++++++++++++
 .../systest/jaxrs/cdi/jetty/JettyEmbeddedTest.java | 13 +++++++
 .../cxf/systest/jaxrs/cdi/jetty/JettyWarTest.java  | 13 +++++++
 .../systest/jaxrs/cdi/tomcat/TomcatWarTest.java    | 13 +++++++
 7 files changed, 104 insertions(+), 10 deletions(-)

diff --git 
a/integration/cdi/src/main/java/org/apache/cxf/cdi/JAXRSCdiResourceExtension.java
 
b/integration/cdi/src/main/java/org/apache/cxf/cdi/JAXRSCdiResourceExtension.java
index 65a636ab02..41d38e2862 100644
--- 
a/integration/cdi/src/main/java/org/apache/cxf/cdi/JAXRSCdiResourceExtension.java
+++ 
b/integration/cdi/src/main/java/org/apache/cxf/cdi/JAXRSCdiResourceExtension.java
@@ -472,7 +472,8 @@ public class JAXRSCdiResourceExtension implements Extension 
{
      */
     private List< Object > loadBeans(final BeanManager beanManager, 
Collection<Class<?>> limitedClasses,
                                      Collection<Bean<?>> beans) {
-        final List< Object > instances = new ArrayList<>();
+        // Use set to account for singletons and application scoped beans
+        final Set< Object > instances = new LinkedHashSet<>();
 
         for (final Bean< ? > bean: beans) {
             if (limitedClasses.isEmpty() || 
limitedClasses.contains(bean.getBeanClass())) {
@@ -486,7 +487,7 @@ public class JAXRSCdiResourceExtension implements Extension 
{
             }
         }
 
-        return instances;
+        return new ArrayList<>(instances);
     }
 
     /**
@@ -495,7 +496,8 @@ public class JAXRSCdiResourceExtension implements Extension 
{
      * @return the references for all discovered CXF-specific features
      */
     private List< Feature > loadFeatures(final BeanManager beanManager, 
Collection<Class<?>> limitedClasses) {
-        final List< Feature > features = new ArrayList<>();
+        // Use set to account for singletons and application scoped beans
+        final Set< Feature > features = new LinkedHashSet<>();
 
         for (final Bean< ? extends Feature > bean: featureBeans) {
             if (limitedClasses.isEmpty() || 
limitedClasses.contains(bean.getBeanClass())) {
@@ -509,7 +511,7 @@ public class JAXRSCdiResourceExtension implements Extension 
{
             }
         }
 
-        return features;
+        return new ArrayList<>(features);
     }
 
     /**
diff --git 
a/systests/cdi/cdi-owb/cdi-producers-owb/src/test/java/org/apache/cxf/systest/jaxrs/cdi/BookStoreFeed.java
 
b/systests/cdi/cdi-owb/cdi-producers-owb/src/test/java/org/apache/cxf/systest/jaxrs/cdi/BookStoreFeed.java
index 9bb24de964..2cb25e0d37 100644
--- 
a/systests/cdi/cdi-owb/cdi-producers-owb/src/test/java/org/apache/cxf/systest/jaxrs/cdi/BookStoreFeed.java
+++ 
b/systests/cdi/cdi-owb/cdi-producers-owb/src/test/java/org/apache/cxf/systest/jaxrs/cdi/BookStoreFeed.java
@@ -31,9 +31,11 @@ import org.apache.cxf.systests.cdi.base.BookStoreService;
 @Path("/bookstore/")
 public class BookStoreFeed {
     private final BookStoreService service;
-    
-    public BookStoreFeed(BookStoreService service) {
+    private final ServerFactoryDebugExtension debugExtension;
+
+    public BookStoreFeed(BookStoreService service, ServerFactoryDebugExtension 
debugExtension) {
         this.service = service;
+        this.debugExtension = debugExtension;
     }
     
     @GET
@@ -51,4 +53,10 @@ public class BookStoreFeed {
         
         return feed;
     }
+
+    @GET
+    @Path("providers")
+    public String providers() {
+        return debugExtension.providers();
+    }
 }
diff --git 
a/systests/cdi/cdi-owb/cdi-producers-owb/src/test/java/org/apache/cxf/systest/jaxrs/cdi/BookStoreProducerApplication.java
 
b/systests/cdi/cdi-owb/cdi-producers-owb/src/test/java/org/apache/cxf/systest/jaxrs/cdi/BookStoreProducerApplication.java
index 98401ffcd1..2487b924da 100644
--- 
a/systests/cdi/cdi-owb/cdi-producers-owb/src/test/java/org/apache/cxf/systest/jaxrs/cdi/BookStoreProducerApplication.java
+++ 
b/systests/cdi/cdi-owb/cdi-producers-owb/src/test/java/org/apache/cxf/systest/jaxrs/cdi/BookStoreProducerApplication.java
@@ -20,6 +20,7 @@ package org.apache.cxf.systest.jaxrs.cdi;
 
 import jakarta.enterprise.inject.Produces;
 import jakarta.inject.Inject;
+import jakarta.inject.Singleton;
 import jakarta.ws.rs.ApplicationPath;
 import jakarta.ws.rs.core.Application;
 import jakarta.ws.rs.core.Feature;
@@ -31,8 +32,8 @@ import org.apache.cxf.systests.cdi.base.BookStoreService;
 public class BookStoreProducerApplication extends Application {
     @Produces protected BookStoreValidatingFeed bookStoreValidatingFeed = new 
BookStoreValidatingFeed();
     @Inject private BookStoreService service;
-    
-    @Produces
+
+    @Produces @Singleton
     public ValidationExceptionMapper validationExceptionMapper() {
         return new ValidationExceptionMapper();
     }
@@ -43,8 +44,8 @@ public class BookStoreProducerApplication extends Application 
{
     }
 
     @Produces
-    public BookStoreFeed bookStoreFeed() {
-        return new BookStoreFeed(service);
+    public BookStoreFeed bookStoreFeed(ServerFactoryDebugExtension 
debugExtension) {
+        return new BookStoreFeed(service, debugExtension);
     }
 
     @Produces
diff --git 
a/systests/cdi/cdi-owb/cdi-producers-owb/src/test/java/org/apache/cxf/systest/jaxrs/cdi/ServerFactoryDebugExtension.java
 
b/systests/cdi/cdi-owb/cdi-producers-owb/src/test/java/org/apache/cxf/systest/jaxrs/cdi/ServerFactoryDebugExtension.java
new file mode 100644
index 0000000000..a1835d9c51
--- /dev/null
+++ 
b/systests/cdi/cdi-owb/cdi-producers-owb/src/test/java/org/apache/cxf/systest/jaxrs/cdi/ServerFactoryDebugExtension.java
@@ -0,0 +1,44 @@
+/**
+ * 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.cxf.systest.jaxrs.cdi;
+
+import java.util.stream.Collectors;
+
+import jakarta.inject.Singleton;
+import org.apache.cxf.jaxrs.JAXRSServerFactoryBean;
+import org.apache.cxf.jaxrs.ext.JAXRSServerFactoryCustomizationExtension;
+
+@Singleton
+public class ServerFactoryDebugExtension implements 
JAXRSServerFactoryCustomizationExtension {
+    private String providers; 
+
+    @Override
+    public void customize(JAXRSServerFactoryBean bean) {
+        providers = bean.getProviders()
+            .stream()
+            .map(t -> t.getClass().getSimpleName())
+            .sorted()
+            .collect(Collectors.joining(","));
+    }
+
+    String providers() {
+        return providers;
+    }
+}
diff --git 
a/systests/cdi/cdi-owb/cdi-producers-owb/src/test/java/org/apache/cxf/systest/jaxrs/cdi/jetty/JettyEmbeddedTest.java
 
b/systests/cdi/cdi-owb/cdi-producers-owb/src/test/java/org/apache/cxf/systest/jaxrs/cdi/jetty/JettyEmbeddedTest.java
index 60872b2923..68a0095076 100644
--- 
a/systests/cdi/cdi-owb/cdi-producers-owb/src/test/java/org/apache/cxf/systest/jaxrs/cdi/jetty/JettyEmbeddedTest.java
+++ 
b/systests/cdi/cdi-owb/cdi-producers-owb/src/test/java/org/apache/cxf/systest/jaxrs/cdi/jetty/JettyEmbeddedTest.java
@@ -21,6 +21,7 @@ package org.apache.cxf.systest.jaxrs.cdi.jetty;
 import java.util.UUID;
 
 import jakarta.ws.rs.core.Form;
+import jakarta.ws.rs.core.MediaType;
 import jakarta.ws.rs.core.Response;
 import org.apache.cxf.jaxrs.model.AbstractResourceInfo;
 import org.apache.cxf.systests.cdi.base.AbstractCdiSingleAppTest;
@@ -85,6 +86,18 @@ public class JettyEmbeddedTest extends 
AbstractCdiSingleAppTest {
         assertEquals(Response.Status.CREATED.getStatusCode(), r.getStatus());
     }
 
+    @Test
+    public void testConfiguredProviders() {
+        assertEquals("AtomFeedProvider,"
+                + "CustomContextFeature,"
+                + "JacksonJsonProvider,"
+                + "JacksonJsonProvider,"
+                + "SampleFeature,"
+                + "SampleNestedFeature,"
+                + "ValidationExceptionMapper",
+            createWebClient(getBasePath() + "/providers", 
MediaType.TEXT_PLAIN).get(String.class).trim());
+    }
+
     @Override
     protected int getPort() {
         return EmbeddedJettyServer.PORT;
diff --git 
a/systests/cdi/cdi-owb/cdi-producers-owb/src/test/java/org/apache/cxf/systest/jaxrs/cdi/jetty/JettyWarTest.java
 
b/systests/cdi/cdi-owb/cdi-producers-owb/src/test/java/org/apache/cxf/systest/jaxrs/cdi/jetty/JettyWarTest.java
index 4bf8e10b87..454727fbb8 100644
--- 
a/systests/cdi/cdi-owb/cdi-producers-owb/src/test/java/org/apache/cxf/systest/jaxrs/cdi/jetty/JettyWarTest.java
+++ 
b/systests/cdi/cdi-owb/cdi-producers-owb/src/test/java/org/apache/cxf/systest/jaxrs/cdi/jetty/JettyWarTest.java
@@ -21,6 +21,7 @@ package org.apache.cxf.systest.jaxrs.cdi.jetty;
 import java.util.UUID;
 
 import jakarta.ws.rs.core.Form;
+import jakarta.ws.rs.core.MediaType;
 import jakarta.ws.rs.core.Response;
 import org.apache.cxf.jaxrs.model.AbstractResourceInfo;
 import org.apache.cxf.systests.cdi.base.AbstractCdiSingleAppTest;
@@ -87,6 +88,18 @@ public class JettyWarTest extends AbstractCdiSingleAppTest {
         assertEquals(Response.Status.CREATED.getStatusCode(), r.getStatus());
     }
 
+    @Test
+    public void testConfiguredProviders() {
+        assertEquals("AtomFeedProvider,"
+                + "CustomContextFeature,"
+                + "JacksonJsonProvider,"
+                + "JacksonJsonProvider,"
+                + "SampleFeature,"
+                + "SampleNestedFeature,"
+                + "ValidationExceptionMapper",
+            createWebClient(getBasePath() + "/providers", 
MediaType.TEXT_PLAIN).get(String.class).trim());
+    }
+
     @Override
     protected int getPort() {
         return EmbeddedJettyServer.PORT;
diff --git 
a/systests/cdi/cdi-owb/cdi-producers-owb/src/test/java/org/apache/cxf/systest/jaxrs/cdi/tomcat/TomcatWarTest.java
 
b/systests/cdi/cdi-owb/cdi-producers-owb/src/test/java/org/apache/cxf/systest/jaxrs/cdi/tomcat/TomcatWarTest.java
index 9ea450de2e..93fdee03d4 100644
--- 
a/systests/cdi/cdi-owb/cdi-producers-owb/src/test/java/org/apache/cxf/systest/jaxrs/cdi/tomcat/TomcatWarTest.java
+++ 
b/systests/cdi/cdi-owb/cdi-producers-owb/src/test/java/org/apache/cxf/systest/jaxrs/cdi/tomcat/TomcatWarTest.java
@@ -21,6 +21,7 @@ package org.apache.cxf.systest.jaxrs.cdi.tomcat;
 import java.util.UUID;
 
 import jakarta.ws.rs.core.Form;
+import jakarta.ws.rs.core.MediaType;
 import jakarta.ws.rs.core.Response;
 import org.apache.cxf.jaxrs.model.AbstractResourceInfo;
 import org.apache.cxf.systests.cdi.base.AbstractCdiSingleAppTest;
@@ -84,6 +85,18 @@ public class TomcatWarTest extends AbstractCdiSingleAppTest {
         assertEquals(Response.Status.CREATED.getStatusCode(), r.getStatus());
     }
 
+    @Test
+    public void testConfiguredProviders() {
+        assertEquals("AtomFeedProvider,"
+                + "CustomContextFeature,"
+                + "JacksonJsonProvider,"
+                + "JacksonJsonProvider,"
+                + "SampleFeature,"
+                + "SampleNestedFeature,"
+                + "ValidationExceptionMapper",
+            createWebClient(getBasePath() + "/providers", 
MediaType.TEXT_PLAIN).get(String.class).trim());
+    }
+
     @Override
     protected int getPort() {
         return EmbeddedTomcatServer.PORT;

Reply via email to