From 4578304b3950afb9d747469942168392f7eb16ff Mon Sep 17 00:00:00 2001 From: bmcguire Date: Tue, 3 Apr 2018 12:21:12 -0700 Subject: [PATCH 1/7] Removing not needed property in application.yml --- springfox-grails-contract-tests/grails-app/conf/application.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/springfox-grails-contract-tests/grails-app/conf/application.yml b/springfox-grails-contract-tests/grails-app/conf/application.yml index c0eb290..fc59990 100644 --- a/springfox-grails-contract-tests/grails-app/conf/application.yml +++ b/springfox-grails-contract-tests/grails-app/conf/application.yml @@ -63,7 +63,7 @@ hibernate: queries: false use_second_level_cache: true use_query_cache: false - region.factory_class: org.hibernate.cache.ehcache.SingletonEhCacheRegionFactory +# region.factory_class: org.hibernate.cache.ehcache.SingletonEhCacheRegionFactory dataSource: pooled: true From 98810966e4320ce75ff19ecebfd61d4e81bdfdd1 Mon Sep 17 00:00:00 2001 From: bmcguire Date: Tue, 3 Apr 2018 12:23:31 -0700 Subject: [PATCH 2/7] Updated the dependencies removed ones that are no longer needed. --- build.gradle | 5 +++-- springfox-grails-contract-tests/build.gradle | 12 +++++------- springfox-grails/build.gradle | 2 +- 3 files changed, 9 insertions(+), 10 deletions(-) diff --git a/build.gradle b/build.gradle index c058723..661fefa 100644 --- a/build.gradle +++ b/build.gradle @@ -12,6 +12,7 @@ allprojects { jcenter() maven { url 'http://oss.jfrog.org/artifactory/oss-snapshot-local/' } mavenCentral() + maven { url "https://repo.grails.org/grails/core" } } ext { @@ -20,7 +21,7 @@ allprojects { classmate = "1.3.4" groovy = "2.4.8" guava = "20.0" - grails = "3.2.4" + grails = "3.3.2" jackson = '2.7.7' joda = "2.9.4" jsonPath = "2.4.0" @@ -31,7 +32,7 @@ allprojects { slf4j = "1.7.22" snakeyaml = '1.19' spock = "1.1-groovy-2.4" - spring = "4.2.8.RELEASE" + spring = "4.2.9.RELEASE" springHateoas = "0.21.0.RELEASE" springPluginVersion = "1.2.0.RELEASE" swagger2Core = "1.5.12" diff --git a/springfox-grails-contract-tests/build.gradle b/springfox-grails-contract-tests/build.gradle index a034397..7bea62c 100644 --- a/springfox-grails-contract-tests/build.gradle +++ b/springfox-grails-contract-tests/build.gradle @@ -5,8 +5,8 @@ buildscript { } dependencies { classpath "org.grails:grails-gradle-plugin:$grailsVersion" - classpath "org.grails.plugins:hibernate5:6.0.2" - classpath "org.grails.plugins:views-gradle:1.1.1" + classpath "org.grails.plugins:hibernate5:6.1.8" + classpath "org.grails.plugins:views-gradle:1.2.6" } } @@ -60,12 +60,10 @@ dependencies { console "org.grails:grails-console" profile "org.grails.profiles:rest-api" - - provided "org.codehaus.groovy:groovy-ant" - runtime "com.h2database:h2" - - testCompile "org.grails:grails-plugin-testing" + runtime "org.apache.tomcat:tomcat-jdbc" + + testCompile "org.grails:grails-web-testing-support" testCompile "org.grails.plugins:geb" testCompile "org.grails:grails-datastore-rest-client" testCompile 'io.rest-assured:rest-assured:3.0.6' diff --git a/springfox-grails/build.gradle b/springfox-grails/build.gradle index aba4d69..c4ee3a6 100644 --- a/springfox-grails/build.gradle +++ b/springfox-grails/build.gradle @@ -18,6 +18,7 @@ buildscript { maven { url "https://plugins.gradle.org/m2/" } + maven { url "https://repo.grails.org/grails/core" } jcenter() mavenCentral() } @@ -49,7 +50,6 @@ dependencies { testCompile "org.spockframework:spock-spring:${spock}" testCompile "org.spockframework:spock-core:${spock}" testCompile "org.codehaus.groovy:groovy-all:${groovy}" - testCompile "org.grails:grails-plugin-testing:${grails}" testCompile "org.grails:grails-plugin-rest:${grails}" provided "io.swagger:swagger-annotations:${swagger2Core}" From 63ce12e680ee37f4183d97a658b506ae9c291daa Mon Sep 17 00:00:00 2001 From: bmcguire Date: Tue, 3 Apr 2018 12:24:05 -0700 Subject: [PATCH 3/7] Updated the version of grails and gradle --- springfox-grails-contract-tests/gradle.properties | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/springfox-grails-contract-tests/gradle.properties b/springfox-grails-contract-tests/gradle.properties index fad431a..98d0fc2 100644 --- a/springfox-grails-contract-tests/gradle.properties +++ b/springfox-grails-contract-tests/gradle.properties @@ -1,2 +1,2 @@ -grailsVersion=3.2.4 -gradleWrapperVersion=3.0 +grailsVersion=3.3.2 +gradleWrapperVersion=3.5 \ No newline at end of file From eec824353a1cda11723e3d224cde6e4b420fe925 Mon Sep 17 00:00:00 2001 From: bmcguire Date: Tue, 3 Apr 2018 12:24:29 -0700 Subject: [PATCH 4/7] Fixed failing test --- .../grails/IndexActionSpecificationFactorySpec.groovy | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/springfox-grails/src/test/groovy/springfox/documentation/grails/IndexActionSpecificationFactorySpec.groovy b/springfox-grails/src/test/groovy/springfox/documentation/grails/IndexActionSpecificationFactorySpec.groovy index 9d6c009..0afb235 100644 --- a/springfox-grails/src/test/groovy/springfox/documentation/grails/IndexActionSpecificationFactorySpec.groovy +++ b/springfox-grails/src/test/groovy/springfox/documentation/grails/IndexActionSpecificationFactorySpec.groovy @@ -1,10 +1,10 @@ package springfox.documentation.grails import com.fasterxml.classmate.TypeResolver -import grails.rest.RestfulController import org.springframework.http.MediaType import org.springframework.web.bind.annotation.RequestMethod + class IndexActionSpecificationFactorySpec extends ActionSpecificationFactorySpec { def "Index action produces action specification" () { given: @@ -17,7 +17,7 @@ class IndexActionSpecificationFactorySpec extends ActionSpecificationFactorySpec spec.consumes == [MediaType.APPLICATION_JSON] as Set spec.produces == [MediaType.APPLICATION_JSON] as Set spec.supportedMethods == [RequestMethod.GET] as Set - spec.handlerMethod.method == RestfulController.declaredMethods.find {it.name == "index" } + (AController.methods.findAll {it.name == "index" }).contains(spec.handlerMethod.method) spec.path == "/a" and: "Parameters match" From 119e7d1a46585ff57c2281c4a4afeea9d39d0450 Mon Sep 17 00:00:00 2001 From: bmcguire Date: Tue, 3 Apr 2018 12:25:21 -0700 Subject: [PATCH 5/7] Fixed the imports for grails 3.3.2 --- .../controllers/grails/springfox/sample/BookController.groovy | 2 +- .../groovy/grails/springfox/sample/SpringFoxSpec.groovy | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/springfox-grails-contract-tests/grails-app/controllers/grails/springfox/sample/BookController.groovy b/springfox-grails-contract-tests/grails-app/controllers/grails/springfox/sample/BookController.groovy index c5a01ea..1626588 100644 --- a/springfox-grails-contract-tests/grails-app/controllers/grails/springfox/sample/BookController.groovy +++ b/springfox-grails-contract-tests/grails-app/controllers/grails/springfox/sample/BookController.groovy @@ -1,6 +1,6 @@ package grails.springfox.sample -import grails.transaction.Transactional +import grails.gorm.transactions.Transactional import io.swagger.annotations.ApiImplicitParam import io.swagger.annotations.ApiImplicitParams import io.swagger.annotations.ApiOperation diff --git a/springfox-grails-contract-tests/src/integration-test/groovy/grails/springfox/sample/SpringFoxSpec.groovy b/springfox-grails-contract-tests/src/integration-test/groovy/grails/springfox/sample/SpringFoxSpec.groovy index f802bb9..fbef049 100644 --- a/springfox-grails-contract-tests/src/integration-test/groovy/grails/springfox/sample/SpringFoxSpec.groovy +++ b/springfox-grails-contract-tests/src/integration-test/groovy/grails/springfox/sample/SpringFoxSpec.groovy @@ -1,6 +1,6 @@ package grails.springfox.sample -import grails.test.mixin.integration.Integration +import grails.testing.mixin.integration.Integration import groovy.json.JsonOutput import org.junit.Assert import org.skyscreamer.jsonassert.JSONAssert From d7ba2694197454c0b516111222dd7d54821fe8b5 Mon Sep 17 00:00:00 2001 From: bmcguire Date: Tue, 3 Apr 2018 12:25:57 -0700 Subject: [PATCH 6/7] Fixed imports and added casting based on Grails Core investigation --- .../springfox/documentation/grails/UrlMappings.java | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/springfox-grails/src/main/java/springfox/documentation/grails/UrlMappings.java b/springfox-grails/src/main/java/springfox/documentation/grails/UrlMappings.java index 38da6e0..46ebc18 100644 --- a/springfox-grails/src/main/java/springfox/documentation/grails/UrlMappings.java +++ b/springfox-grails/src/main/java/springfox/documentation/grails/UrlMappings.java @@ -4,7 +4,7 @@ import com.fasterxml.classmate.TypeResolver; import com.google.common.base.Strings; import grails.core.GrailsDomainClass; -import grails.validation.ConstrainedProperty; +import grails.gorm.validation.ConstrainedProperty; import grails.web.mapping.UrlMapping; import springfox.documentation.service.ResolvedMethodParameter; @@ -36,7 +36,7 @@ && controllerMatches(u, logicalControllerName) } public static Map pathParameters(UrlMapping mapping) { - ConstrainedProperty[] constraints = mapping.getConstraints(); + ConstrainedProperty[] constraints = (ConstrainedProperty[])mapping.getConstraints(); return IntStream.range(0, constraints.length) .filter(indicesToUse(mapping)) .mapToObj(i -> constraints[i]) @@ -49,7 +49,7 @@ public static List resolvedPathParameters( TypeResolver resolver, UrlMapping mapping, GrailsDomainClass domainClass) { - ConstrainedProperty[] constraints = mapping.getConstraints(); + ConstrainedProperty[] constraints = (ConstrainedProperty[])mapping.getConstraints(); List pathProperties = IntStream.range(0, constraints.length) .filter(indicesToUse(mapping)) .mapToObj(i -> constraints[i]) @@ -68,7 +68,7 @@ public static List resolvedPathParameters( private static IntPredicate indicesToUse(UrlMapping mapping) { return index -> { - ConstrainedProperty property = mapping.getConstraints()[index]; + ConstrainedProperty property = (ConstrainedProperty)mapping.getConstraints()[index]; return !property.getPropertyName().equals("controller") && !property.getPropertyName().equals("action") && !property.isNullable(); @@ -120,7 +120,7 @@ private static boolean isWildcardAction(UrlMapping urlMapping) { } private static boolean hasControllerConstraint(UrlMapping urlMapping, String name) { - return !Arrays.stream(urlMapping.getConstraints()) + return !Arrays.stream((ConstrainedProperty[])urlMapping.getConstraints()) .filter(c -> c.getPropertyName().equals(name)) .collect(Collectors.toList()).isEmpty(); } From 4de8f25ee35bac9aad85116c1b662556c1f6939a Mon Sep 17 00:00:00 2001 From: bmcguire Date: Tue, 3 Apr 2018 12:27:28 -0700 Subject: [PATCH 7/7] Fixed issue with Spring startup and Grails startup. This now delays the documentation plugin bootstrap from starting until Grails has started. This resolves the issue with the GORM startup exception --- ...ringfoxGrailsIntegrationConfiguration.java | 30 ++++++++++++++ ...aggerDocumentationPluginsBootstrapper.java | 31 +++++++++++++++ ...SwaggerGrailsApplicationPostProcessor.java | 39 +++++++++++++++++++ 3 files changed, 100 insertions(+) create mode 100644 springfox-grails/src/main/java/springfox/documentation/grails/SwaggerDocumentationPluginsBootstrapper.java create mode 100644 springfox-grails/src/main/java/springfox/documentation/grails/SwaggerGrailsApplicationPostProcessor.java diff --git a/springfox-grails/src/main/java/springfox/documentation/grails/SpringfoxGrailsIntegrationConfiguration.java b/springfox-grails/src/main/java/springfox/documentation/grails/SpringfoxGrailsIntegrationConfiguration.java index 802f163..4c3272d 100644 --- a/springfox-grails/src/main/java/springfox/documentation/grails/SpringfoxGrailsIntegrationConfiguration.java +++ b/springfox-grails/src/main/java/springfox/documentation/grails/SpringfoxGrailsIntegrationConfiguration.java @@ -1,9 +1,19 @@ package springfox.documentation.grails; +import com.fasterxml.classmate.TypeResolver; import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Configuration; +import springfox.documentation.spi.service.RequestHandlerProvider; +import springfox.documentation.spi.service.contexts.Defaults; +import springfox.documentation.spring.web.DocumentationCache; +import springfox.documentation.spring.web.plugins.DocumentationPluginsBootstrapper; +import springfox.documentation.spring.web.plugins.DocumentationPluginsManager; +import springfox.documentation.spring.web.scanners.ApiDocumentationScanner; + +import javax.servlet.ServletContext; +import java.util.List; @Configuration @ComponentScan(basePackages = "springfox.documentation.grails") @@ -26,4 +36,24 @@ public GrailsPropertyTransformer propertyTransformer() { public GeneratedClassNamingStrategy namingStrategy() { return new DefaultGeneratedClassNamingStrategy(); } + + @Bean + DocumentationPluginsBootstrapper documentationPluginsBootstrapper( + DocumentationPluginsManager documentationPluginsManager, + List handlerProviders, + DocumentationCache scanned, + ApiDocumentationScanner resourceListing, + TypeResolver typeResolver, + Defaults defaults, + ServletContext servletContext) { + + return new SwaggerDocumentationPluginsBootstrapper( + documentationPluginsManager, + handlerProviders, + scanned, + resourceListing, + typeResolver, + defaults, + servletContext); + } } diff --git a/springfox-grails/src/main/java/springfox/documentation/grails/SwaggerDocumentationPluginsBootstrapper.java b/springfox-grails/src/main/java/springfox/documentation/grails/SwaggerDocumentationPluginsBootstrapper.java new file mode 100644 index 0000000..18e486d --- /dev/null +++ b/springfox-grails/src/main/java/springfox/documentation/grails/SwaggerDocumentationPluginsBootstrapper.java @@ -0,0 +1,31 @@ +package springfox.documentation.grails; + +import com.fasterxml.classmate.TypeResolver; +import springfox.documentation.spi.service.RequestHandlerProvider; +import springfox.documentation.spi.service.contexts.Defaults; +import springfox.documentation.spring.web.DocumentationCache; +import springfox.documentation.spring.web.plugins.DocumentationPluginsBootstrapper; +import springfox.documentation.spring.web.plugins.DocumentationPluginsManager; +import springfox.documentation.spring.web.scanners.ApiDocumentationScanner; + +import javax.servlet.ServletContext; +import java.util.List; + +public class SwaggerDocumentationPluginsBootstrapper extends DocumentationPluginsBootstrapper { + + SwaggerDocumentationPluginsBootstrapper(DocumentationPluginsManager documentationPluginsManager, + List handlerProviders, + DocumentationCache scanned, + ApiDocumentationScanner resourceListing, + TypeResolver typeResolver, + Defaults defaults, + ServletContext servletContext) { + super(documentationPluginsManager, handlerProviders, scanned, resourceListing, typeResolver, defaults, servletContext); + } + + @Override + public boolean isAutoStartup() { + return false; + } + +} diff --git a/springfox-grails/src/main/java/springfox/documentation/grails/SwaggerGrailsApplicationPostProcessor.java b/springfox-grails/src/main/java/springfox/documentation/grails/SwaggerGrailsApplicationPostProcessor.java new file mode 100644 index 0000000..797789d --- /dev/null +++ b/springfox-grails/src/main/java/springfox/documentation/grails/SwaggerGrailsApplicationPostProcessor.java @@ -0,0 +1,39 @@ +package springfox.documentation.grails; + +import grails.core.GrailsApplicationLifeCycle; +import groovy.lang.Closure; +import org.springframework.stereotype.Component; +import springfox.documentation.spring.web.plugins.DocumentationPluginsBootstrapper; + +import java.util.Map; + + +@Component +public class SwaggerGrailsApplicationPostProcessor implements GrailsApplicationLifeCycle { + + private DocumentationPluginsBootstrapper documentationPluginsBootstrapper; + + public SwaggerGrailsApplicationPostProcessor(DocumentationPluginsBootstrapper documentationPluginsBootstrapper){ + this.documentationPluginsBootstrapper = documentationPluginsBootstrapper; + } + + @Override + public Closure doWithSpring() { return null; } + + @Override + public void doWithDynamicMethods() {} + + @Override + public void doWithApplicationContext() {} + + @Override + public void onConfigChange(Map event) {} + + @Override + public void onStartup(Map event) { + documentationPluginsBootstrapper.start(); + } + + @Override + public void onShutdown(Map event) {} +}