This is an automated email from the ASF dual-hosted git repository. ahuber pushed a commit to branch spring6 in repository https://gitbox.apache.org/repos/asf/isis.git
commit 512a96d2f11f1e42cbf55119c66f8ac999797f4b Author: Andi Huber <[email protected]> AuthorDate: Sun Nov 27 08:48:40 2022 +0100 ISIS-3275: testing: resteasy provisioning fixes --- .../causeway/testdomain/rest/RestServiceTest.java | 12 +- .../conf/Configuration_usingSpring6.java | 150 +++++++++++++++++++++ .../resources/DomainObjectResourceServerside.java | 7 +- .../resources/DomainServiceResourceServerside.java | 7 +- .../resources/DomainTypeResourceServerside.java | 7 +- .../resources/HomePageResourceServerside.java | 7 +- .../viewer/resources/ImageResourceServerside.java | 7 +- .../resources/MenuBarsResourceServerside.java | 7 +- .../viewer/resources/SwaggerSpecResource.java | 4 +- .../viewer/resources/UserResourceServerside.java | 7 +- .../resources/VersionResourceServerside.java | 7 +- 11 files changed, 189 insertions(+), 33 deletions(-) diff --git a/regressiontests/stable-rest/src/test/java/org/apache/causeway/testdomain/rest/RestServiceTest.java b/regressiontests/stable-rest/src/test/java/org/apache/causeway/testdomain/rest/RestServiceTest.java index 2f6711301c..88ecbf9287 100644 --- a/regressiontests/stable-rest/src/test/java/org/apache/causeway/testdomain/rest/RestServiceTest.java +++ b/regressiontests/stable-rest/src/test/java/org/apache/causeway/testdomain/rest/RestServiceTest.java @@ -18,6 +18,9 @@ */ package org.apache.causeway.testdomain.rest; +import jakarta.inject.Inject; +import jakarta.xml.bind.JAXBException; + import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; import org.springframework.boot.test.context.SpringBootTest; @@ -31,16 +34,13 @@ import static org.junit.jupiter.api.Assertions.assertTrue; import org.apache.causeway.core.config.presets.CausewayPresets; import org.apache.causeway.testdomain.conf.Configuration_usingJdo; +import org.apache.causeway.testdomain.conf.Configuration_usingSpring6; import org.apache.causeway.testdomain.jdo.JdoInventoryJaxbVm; import org.apache.causeway.testdomain.jdo.JdoTestFixtures; import org.apache.causeway.testdomain.jdo.entities.JdoBook; import org.apache.causeway.testdomain.util.rest.RestEndpointService; -import org.apache.causeway.testing.fixtures.applib.fixturescripts.ExecutionParametersServiceAutoConfiguration; -import org.apache.causeway.testing.fixtures.applib.fixturescripts.FixtureScriptsSpecificationProviderAutoConfiguration; import org.apache.causeway.viewer.restfulobjects.jaxrsresteasy.CausewayModuleViewerRestfulObjectsJaxrsResteasy; -import jakarta.inject.Inject; -import jakarta.xml.bind.JAXBException; import lombok.val; @SpringBootTest( @@ -48,11 +48,9 @@ import lombok.val; webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT) @TestPropertySource(CausewayPresets.UseLog4j2Test) @Import({ + Configuration_usingSpring6.class, Configuration_usingJdo.class, CausewayModuleViewerRestfulObjectsJaxrsResteasy.class, - - FixtureScriptsSpecificationProviderAutoConfiguration.class, // because something? disables autoconfiguration - ExecutionParametersServiceAutoConfiguration.class // because something? disables autoconfiguration }) class RestServiceTest { diff --git a/regressiontests/stable/src/main/java/org/apache/causeway/testdomain/conf/Configuration_usingSpring6.java b/regressiontests/stable/src/main/java/org/apache/causeway/testdomain/conf/Configuration_usingSpring6.java new file mode 100644 index 0000000000..c159817845 --- /dev/null +++ b/regressiontests/stable/src/main/java/org/apache/causeway/testdomain/conf/Configuration_usingSpring6.java @@ -0,0 +1,150 @@ +/* + * 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.causeway.testdomain.conf; + +import java.util.Set; + +import jakarta.servlet.Servlet; +import jakarta.servlet.ServletContainerInitializer; + +import org.jboss.resteasy.plugins.server.servlet.HttpServlet30Dispatcher; +import org.jboss.resteasy.plugins.server.servlet.ResteasyContextParameters; +import org.jboss.resteasy.plugins.servlet.ResteasyServletInitializer; +import org.jboss.resteasy.springboot.ResteasyEmbeddedServletInitializer; +import org.springframework.boot.web.servlet.ServletRegistrationBean; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Import; + +import org.apache.causeway.testing.fixtures.applib.fixturescripts.ExecutionParametersServiceAutoConfiguration; +import org.apache.causeway.testing.fixtures.applib.fixturescripts.FixtureScriptsSpecificationProviderAutoConfiguration; + +import lombok.extern.log4j.Log4j2; + +/** + * Introduced for the purpose of troubleshooting Spring 5.x to 6.x migration issues. + * @deprecated marked deprecated, to be removed once no longer needed + */ +@Deprecated(forRemoval = true) +@Configuration +@Import({ + ResteasyEmbeddedServletInitializer.class, //FIXME[ISIS-3275] move up the hierarchy? + FixtureScriptsSpecificationProviderAutoConfiguration.class, // because something? disables autoconfiguration + ExecutionParametersServiceAutoConfiguration.class // because something? disables autoconfiguration +}) +@Log4j2 +public class Configuration_usingSpring6 { + + /** + * This class is the Spring Boot equivalent of {@link ResteasyServletInitializer}, + * which implements the Servlet API {@link ServletContainerInitializer} interface + * to find all JAX-RS Application, Provider and Path classes in the classpath. + * <p> + * As we all know, in Spring Boot we use an embedded servlet container. However, + * the Servlet spec does not support embedded containers, and many portions of it + * do not apply to embedded containers, and ServletContainerInitializer is one of them. + * <p> + * This class fills in this gap. + * <p> + * Notice that the JAX-RS Application classes are found in this RESTEasy starter by class + * ResteasyEmbeddedServletInitializer, and that is done by scanning the classpath. + * <p> + * The Path and Provider annotated classes are found by using Spring framework (instead of + * scanning the classpath), since it is assumed those classes are ALWAYS necessarily + * Spring beans (this starter is meant for Spring Boot applications that use RESTEasy + * as the JAX-RS implementation) + * + * @see "https://github.com/paypal/resteasy-spring-boot/blob/master/resteasy-spring-boot-starter/src/main/java/com/paypal/springboot/resteasy/ResteasyApplicationBuilder.java" + */ + public static class ResteasyApplicationBuilder { + + public static final String BEAN_NAME = "JaxrsApplicationServletBuilder"; + + public ServletRegistrationBean<Servlet> build( + final String applicationClassName, + final String path, + final Set<Class<?>> resources, + final Set<Class<?>> providers) { + Servlet servlet = new HttpServlet30Dispatcher(); + + ServletRegistrationBean<Servlet> servletRegistrationBean = new ServletRegistrationBean<Servlet>(servlet); + + servletRegistrationBean.setName(applicationClassName); + servletRegistrationBean.setLoadOnStartup(1); + servletRegistrationBean.setAsyncSupported(true); + servletRegistrationBean.addInitParameter("javax.ws.rs.Application", applicationClassName); + + if (path != null) { + String mapping = path; + if (!mapping.startsWith("/")) + mapping = "/" + mapping; + String prefix = mapping; + if (!"/".equals(prefix) && prefix.endsWith("/")) + prefix = prefix.substring(0, prefix.length() - 1); + if (mapping.endsWith("/")) + mapping += "*"; + else + mapping += "/*"; + // resteasy.servlet.mapping.prefix + servletRegistrationBean.addInitParameter("resteasy.servlet.mapping.prefix", prefix); + servletRegistrationBean.addUrlMappings(mapping); + } + + if (resources.size() > 0) { + StringBuilder builder = new StringBuilder(); + boolean first = true; + for (Class<?> resource : resources) { + if (first) { + first = false; + } else { + builder.append(","); + } + + builder.append(resource.getName()); + } + servletRegistrationBean.addInitParameter(ResteasyContextParameters.RESTEASY_SCANNED_RESOURCES, builder.toString()); + } + if (providers.size() > 0) { + StringBuilder builder = new StringBuilder(); + boolean first = true; + for (Class<?> provider : providers) { + if (first) { + first = false; + } else { + builder.append(","); + } + builder.append(provider.getName()); + } + servletRegistrationBean.addInitParameter(ResteasyContextParameters.RESTEASY_SCANNED_PROVIDERS, builder.toString()); + } + + log.debug("ServletRegistrationBean has just bean created for JAX-RS class " + applicationClassName); + + return servletRegistrationBean; + } + + } + + + @Bean(name = "JaxrsApplicationServletBuilder") + public ResteasyApplicationBuilder resteasyApplicationBuilder() { + return new ResteasyApplicationBuilder(); + } + +} diff --git a/viewers/restfulobjects/viewer/src/main/java/org/apache/causeway/viewer/restfulobjects/viewer/resources/DomainObjectResourceServerside.java b/viewers/restfulobjects/viewer/src/main/java/org/apache/causeway/viewer/restfulobjects/viewer/resources/DomainObjectResourceServerside.java index c4897ddc8d..0575b560a4 100644 --- a/viewers/restfulobjects/viewer/src/main/java/org/apache/causeway/viewer/restfulobjects/viewer/resources/DomainObjectResourceServerside.java +++ b/viewers/restfulobjects/viewer/src/main/java/org/apache/causeway/viewer/restfulobjects/viewer/resources/DomainObjectResourceServerside.java @@ -32,6 +32,7 @@ import jakarta.ws.rs.Path; import jakarta.ws.rs.PathParam; import jakarta.ws.rs.Produces; import jakarta.ws.rs.QueryParam; +import jakarta.ws.rs.core.Context; import jakarta.ws.rs.core.MediaType; import jakarta.ws.rs.core.Response; @@ -83,9 +84,9 @@ implements DomainObjectResource { @Inject public DomainObjectResourceServerside( - final MetaModelContext metaModelContext, - final CausewayConfiguration causewayConfiguration, - final InteractionLayerTracker iInteractionLayerTracker) { + final @Context MetaModelContext metaModelContext, + final @Context CausewayConfiguration causewayConfiguration, + final @Context InteractionLayerTracker iInteractionLayerTracker) { super(metaModelContext, causewayConfiguration, iInteractionLayerTracker); log.debug("<init>"); } diff --git a/viewers/restfulobjects/viewer/src/main/java/org/apache/causeway/viewer/restfulobjects/viewer/resources/DomainServiceResourceServerside.java b/viewers/restfulobjects/viewer/src/main/java/org/apache/causeway/viewer/restfulobjects/viewer/resources/DomainServiceResourceServerside.java index 6a4486de52..94f9118af8 100644 --- a/viewers/restfulobjects/viewer/src/main/java/org/apache/causeway/viewer/restfulobjects/viewer/resources/DomainServiceResourceServerside.java +++ b/viewers/restfulobjects/viewer/src/main/java/org/apache/causeway/viewer/restfulobjects/viewer/resources/DomainServiceResourceServerside.java @@ -32,6 +32,7 @@ import jakarta.ws.rs.Path; import jakarta.ws.rs.PathParam; import jakarta.ws.rs.Produces; import jakarta.ws.rs.QueryParam; +import jakarta.ws.rs.core.Context; import jakarta.ws.rs.core.MediaType; import jakarta.ws.rs.core.Response; @@ -72,9 +73,9 @@ implements DomainServiceResource { @Inject public DomainServiceResourceServerside( - final MetaModelContext metaModelContext, - final CausewayConfiguration causewayConfiguration, - final InteractionLayerTracker iInteractionLayerTracker) { + final @Context MetaModelContext metaModelContext, + final @Context CausewayConfiguration causewayConfiguration, + final @Context InteractionLayerTracker iInteractionLayerTracker) { super(metaModelContext, causewayConfiguration, iInteractionLayerTracker); log.debug("<init>"); } diff --git a/viewers/restfulobjects/viewer/src/main/java/org/apache/causeway/viewer/restfulobjects/viewer/resources/DomainTypeResourceServerside.java b/viewers/restfulobjects/viewer/src/main/java/org/apache/causeway/viewer/restfulobjects/viewer/resources/DomainTypeResourceServerside.java index 734c20b1ae..aafd8cc65e 100644 --- a/viewers/restfulobjects/viewer/src/main/java/org/apache/causeway/viewer/restfulobjects/viewer/resources/DomainTypeResourceServerside.java +++ b/viewers/restfulobjects/viewer/src/main/java/org/apache/causeway/viewer/restfulobjects/viewer/resources/DomainTypeResourceServerside.java @@ -26,6 +26,7 @@ import jakarta.ws.rs.Path; import jakarta.ws.rs.PathParam; import jakarta.ws.rs.Produces; import jakarta.ws.rs.QueryParam; +import jakarta.ws.rs.core.Context; import jakarta.ws.rs.core.MediaType; import jakarta.ws.rs.core.Response; @@ -84,9 +85,9 @@ implements DomainTypeResource { @Inject public DomainTypeResourceServerside( - final MetaModelContext metaModelContext, - final CausewayConfiguration causewayConfiguration, - final InteractionLayerTracker iInteractionLayerTracker) { + final @Context MetaModelContext metaModelContext, + final @Context CausewayConfiguration causewayConfiguration, + final @Context InteractionLayerTracker iInteractionLayerTracker) { super(metaModelContext, causewayConfiguration, iInteractionLayerTracker); log.debug("<init>"); } diff --git a/viewers/restfulobjects/viewer/src/main/java/org/apache/causeway/viewer/restfulobjects/viewer/resources/HomePageResourceServerside.java b/viewers/restfulobjects/viewer/src/main/java/org/apache/causeway/viewer/restfulobjects/viewer/resources/HomePageResourceServerside.java index 594d33e2c9..10aa4ea9e7 100644 --- a/viewers/restfulobjects/viewer/src/main/java/org/apache/causeway/viewer/restfulobjects/viewer/resources/HomePageResourceServerside.java +++ b/viewers/restfulobjects/viewer/src/main/java/org/apache/causeway/viewer/restfulobjects/viewer/resources/HomePageResourceServerside.java @@ -22,6 +22,7 @@ import jakarta.inject.Inject; import jakarta.ws.rs.GET; import jakarta.ws.rs.Path; import jakarta.ws.rs.Produces; +import jakarta.ws.rs.core.Context; import jakarta.ws.rs.core.MediaType; import jakarta.ws.rs.core.Response; @@ -53,9 +54,9 @@ implements HomePageResource { @Inject public HomePageResourceServerside( - final MetaModelContext metaModelContext, - final CausewayConfiguration causewayConfiguration, - final InteractionLayerTracker iInteractionLayerTracker) { + final @Context MetaModelContext metaModelContext, + final @Context CausewayConfiguration causewayConfiguration, + final @Context InteractionLayerTracker iInteractionLayerTracker) { super(metaModelContext, causewayConfiguration, iInteractionLayerTracker); log.debug("<init>"); } diff --git a/viewers/restfulobjects/viewer/src/main/java/org/apache/causeway/viewer/restfulobjects/viewer/resources/ImageResourceServerside.java b/viewers/restfulobjects/viewer/src/main/java/org/apache/causeway/viewer/restfulobjects/viewer/resources/ImageResourceServerside.java index 822791e269..4d479b7bbc 100644 --- a/viewers/restfulobjects/viewer/src/main/java/org/apache/causeway/viewer/restfulobjects/viewer/resources/ImageResourceServerside.java +++ b/viewers/restfulobjects/viewer/src/main/java/org/apache/causeway/viewer/restfulobjects/viewer/resources/ImageResourceServerside.java @@ -25,6 +25,7 @@ import jakarta.inject.Inject; import jakarta.ws.rs.GET; import jakarta.ws.rs.Path; import jakarta.ws.rs.Produces; +import jakarta.ws.rs.core.Context; import jakarta.ws.rs.core.Response; import org.springframework.stereotype.Component; @@ -44,9 +45,9 @@ public class ImageResourceServerside extends ResourceAbstract { @Inject public ImageResourceServerside( - final MetaModelContext metaModelContext, - final CausewayConfiguration causewayConfiguration, - final InteractionLayerTracker iInteractionLayerTracker) { + final @Context MetaModelContext metaModelContext, + final @Context CausewayConfiguration causewayConfiguration, + final @Context InteractionLayerTracker iInteractionLayerTracker) { super(metaModelContext, causewayConfiguration, iInteractionLayerTracker); log.debug("<init>"); } diff --git a/viewers/restfulobjects/viewer/src/main/java/org/apache/causeway/viewer/restfulobjects/viewer/resources/MenuBarsResourceServerside.java b/viewers/restfulobjects/viewer/src/main/java/org/apache/causeway/viewer/restfulobjects/viewer/resources/MenuBarsResourceServerside.java index d58941ca65..06881c3466 100644 --- a/viewers/restfulobjects/viewer/src/main/java/org/apache/causeway/viewer/restfulobjects/viewer/resources/MenuBarsResourceServerside.java +++ b/viewers/restfulobjects/viewer/src/main/java/org/apache/causeway/viewer/restfulobjects/viewer/resources/MenuBarsResourceServerside.java @@ -23,6 +23,7 @@ import java.util.function.Consumer; import jakarta.inject.Inject; import jakarta.ws.rs.HttpMethod; import jakarta.ws.rs.Produces; +import jakarta.ws.rs.core.Context; import jakarta.ws.rs.core.MediaType; import jakarta.ws.rs.core.Response; @@ -54,9 +55,9 @@ public class MenuBarsResourceServerside extends ResourceAbstract implements Menu @Inject public MenuBarsResourceServerside( - final MetaModelContext metaModelContext, - final CausewayConfiguration causewayConfiguration, - final InteractionLayerTracker iInteractionLayerTracker) { + final @Context MetaModelContext metaModelContext, + final @Context CausewayConfiguration causewayConfiguration, + final @Context InteractionLayerTracker iInteractionLayerTracker) { super(metaModelContext, causewayConfiguration, iInteractionLayerTracker); } diff --git a/viewers/restfulobjects/viewer/src/main/java/org/apache/causeway/viewer/restfulobjects/viewer/resources/SwaggerSpecResource.java b/viewers/restfulobjects/viewer/src/main/java/org/apache/causeway/viewer/restfulobjects/viewer/resources/SwaggerSpecResource.java index 48f1237a2b..1b85f97f1a 100644 --- a/viewers/restfulobjects/viewer/src/main/java/org/apache/causeway/viewer/restfulobjects/viewer/resources/SwaggerSpecResource.java +++ b/viewers/restfulobjects/viewer/src/main/java/org/apache/causeway/viewer/restfulobjects/viewer/resources/SwaggerSpecResource.java @@ -55,8 +55,8 @@ public class SwaggerSpecResource { @Inject public SwaggerSpecResource( - final SwaggerService swaggerService, - final InteractionService interactionService) { + final @Context SwaggerService swaggerService, + final @Context InteractionService interactionService) { this.swaggerService = swaggerService; this.interactionService = interactionService; log.debug("<init>"); diff --git a/viewers/restfulobjects/viewer/src/main/java/org/apache/causeway/viewer/restfulobjects/viewer/resources/UserResourceServerside.java b/viewers/restfulobjects/viewer/src/main/java/org/apache/causeway/viewer/restfulobjects/viewer/resources/UserResourceServerside.java index 628cad31b4..c49f9f85e2 100644 --- a/viewers/restfulobjects/viewer/src/main/java/org/apache/causeway/viewer/restfulobjects/viewer/resources/UserResourceServerside.java +++ b/viewers/restfulobjects/viewer/src/main/java/org/apache/causeway/viewer/restfulobjects/viewer/resources/UserResourceServerside.java @@ -23,6 +23,7 @@ import java.net.URISyntaxException; import jakarta.inject.Inject; import jakarta.ws.rs.Produces; +import jakarta.ws.rs.core.Context; import jakarta.ws.rs.core.MediaType; import jakarta.ws.rs.core.Response; @@ -51,9 +52,9 @@ public class UserResourceServerside extends ResourceAbstract implements UserReso @Inject public UserResourceServerside( - final MetaModelContext metaModelContext, - final CausewayConfiguration causewayConfiguration, - final InteractionLayerTracker iInteractionLayerTracker) { + final @Context MetaModelContext metaModelContext, + final @Context CausewayConfiguration causewayConfiguration, + final @Context InteractionLayerTracker iInteractionLayerTracker) { super(metaModelContext, causewayConfiguration, iInteractionLayerTracker); } diff --git a/viewers/restfulobjects/viewer/src/main/java/org/apache/causeway/viewer/restfulobjects/viewer/resources/VersionResourceServerside.java b/viewers/restfulobjects/viewer/src/main/java/org/apache/causeway/viewer/restfulobjects/viewer/resources/VersionResourceServerside.java index b2e036c64c..53c20066ed 100644 --- a/viewers/restfulobjects/viewer/src/main/java/org/apache/causeway/viewer/restfulobjects/viewer/resources/VersionResourceServerside.java +++ b/viewers/restfulobjects/viewer/src/main/java/org/apache/causeway/viewer/restfulobjects/viewer/resources/VersionResourceServerside.java @@ -24,6 +24,7 @@ import jakarta.inject.Inject; import jakarta.ws.rs.GET; import jakarta.ws.rs.Path; import jakarta.ws.rs.Produces; +import jakarta.ws.rs.core.Context; import jakarta.ws.rs.core.HttpHeaders; import jakarta.ws.rs.core.MediaType; import jakarta.ws.rs.core.Response; @@ -63,9 +64,9 @@ implements VersionResource { @Inject public VersionResourceServerside( - final MetaModelContext metaModelContext, - final CausewayConfiguration causewayConfiguration, - final InteractionLayerTracker iInteractionLayerTracker) { + final @Context MetaModelContext metaModelContext, + final @Context CausewayConfiguration causewayConfiguration, + final @Context InteractionLayerTracker iInteractionLayerTracker) { super(metaModelContext, causewayConfiguration, iInteractionLayerTracker); log.debug("<init>"); }
