This is an automated email from the ASF dual-hosted git repository. reta pushed a commit to branch 3.6.x-fixes in repository https://gitbox.apache.org/repos/asf/cxf.git
commit f1f32b6f583ccd07d3a3b9421383f555a9ec75bb 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) (cherry picked from commit af21744e02a97cc081f3392579238c10d18b7152) # Conflicts: # systests/cdi/cdi-owb/cdi-producers-owb/src/test/java/org/apache/cxf/systest/jaxrs/cdi/BookStoreProducerApplication.java # systests/cdi/cdi-owb/cdi-producers-owb/src/test/java/org/apache/cxf/systest/jaxrs/cdi/jetty/JettyEmbeddedTest.java # systests/cdi/cdi-owb/cdi-producers-owb/src/test/java/org/apache/cxf/systest/jaxrs/cdi/jetty/JettyWarTest.java # systests/cdi/cdi-owb/cdi-producers-owb/src/test/java/org/apache/cxf/systest/jaxrs/cdi/tomcat/TomcatWarTest.java --- .../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 02263d35b0..8f07435cb8 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 @@ -473,7 +473,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())) { @@ -487,7 +488,7 @@ public class JAXRSCdiResourceExtension implements Extension { } } - return instances; + return new ArrayList<>(instances); } /** @@ -496,7 +497,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())) { @@ -510,7 +512,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 998e49d381..4d29314357 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 @@ -32,9 +32,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 @@ -52,4 +54,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 5d2217aa1c..8485f4afad 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 javax.enterprise.inject.Produces; import javax.inject.Inject; +import javax.inject.Singleton; import javax.ws.rs.ApplicationPath; import javax.ws.rs.core.Application; import javax.ws.rs.core.Feature; @@ -32,8 +33,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(); } @@ -44,8 +45,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..b521f36917 --- /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 javax.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 4e538ba1eb..dde210107e 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 javax.ws.rs.core.Form; +import javax.ws.rs.core.MediaType; import javax.ws.rs.core.Response; import org.apache.cxf.jaxrs.model.AbstractResourceInfo; @@ -86,6 +87,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 a9f8fcc685..37ddd3a3d0 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 javax.ws.rs.core.Form; +import javax.ws.rs.core.MediaType; import javax.ws.rs.core.Response; import org.apache.cxf.jaxrs.model.AbstractResourceInfo; @@ -88,6 +89,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 ae9c62f859..99b229c744 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 javax.ws.rs.core.Form; +import javax.ws.rs.core.MediaType; import javax.ws.rs.core.Response; import org.apache.cxf.jaxrs.model.AbstractResourceInfo; @@ -85,6 +86,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;
