diff --git a/initializr-service/src/main/java/io/spring/initializr/service/extension/JacksonKotlinRequestPostProcessor.java b/initializr-service/src/main/java/io/spring/initializr/service/extension/JacksonKotlinRequestPostProcessor.java new file mode 100644 index 0000000000..e6ff72b98d --- /dev/null +++ b/initializr-service/src/main/java/io/spring/initializr/service/extension/JacksonKotlinRequestPostProcessor.java @@ -0,0 +1,51 @@ +/* + * Copyright 2012-2018 the original author or authors. + * + * Licensed 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 io.spring.initializr.service.extension; + +import io.spring.initializr.generator.ProjectRequest; +import io.spring.initializr.generator.ProjectRequestPostProcessor; +import io.spring.initializr.metadata.Dependency; +import io.spring.initializr.metadata.InitializrMetadata; + +import org.springframework.stereotype.Component; + +/** + * A {@link ProjectRequestPostProcessor} that automatically adds "jackson-module-kotlin" + * when Kotlin is used and a dependency has the "json" facet. + * + * @author Sebastien Deleuze + */ +@Component +class JacksonKotlinRequestPostProcessor implements ProjectRequestPostProcessor { + + private final Dependency jacksonModuleKotlin; + + public JacksonKotlinRequestPostProcessor() { + this.jacksonModuleKotlin = Dependency.withId("jackson-module-kotlin", + "com.fasterxml.jackson.module", "jackson-module-kotlin"); + } + + @Override + public void postProcessAfterResolution(ProjectRequest request, + InitializrMetadata metadata) { + if (request.getFacets().contains("json") + && "kotlin".equals(request.getLanguage())) { + request.getResolvedDependencies().add(this.jacksonModuleKotlin); + } + } + +} diff --git a/initializr-service/src/main/resources/application.yml b/initializr-service/src/main/resources/application.yml index 5870ca99be..8360f3d12f 100644 --- a/initializr-service/src/main/resources/application.yml +++ b/initializr-service/src/main/resources/application.yml @@ -284,6 +284,7 @@ initializr: weight: 100 facets: - web + - json links: - rel: guide href: https://spring.io/guides/gs/rest-service/ @@ -301,9 +302,13 @@ initializr: versionRange: 2.0.0.M1 description: Reactive web development with Netty and Spring WebFlux weight: 90 + facets: + - json - name: Rest Repositories id: data-rest weight: 10 + facets: + - json description: Exposing Spring Data repositories over REST via spring-data-rest-webmvc links: - rel: guide @@ -353,6 +358,8 @@ initializr: - name: Jersey (JAX-RS) id: jersey description: RESTful Web Services framework with support of JAX-RS + facets: + - json versionRange: 1.2.0.RELEASE links: - rel: reference diff --git a/initializr-service/src/test/java/io/spring/initializr/service/extension/JacksonKotlinRequestPostProcessorTests.java b/initializr-service/src/test/java/io/spring/initializr/service/extension/JacksonKotlinRequestPostProcessorTests.java new file mode 100644 index 0000000000..042c996907 --- /dev/null +++ b/initializr-service/src/test/java/io/spring/initializr/service/extension/JacksonKotlinRequestPostProcessorTests.java @@ -0,0 +1,77 @@ +/* + * Copyright 2012-2017 the original author or authors. + * + * Licensed 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 io.spring.initializr.service.extension; + +import io.spring.initializr.generator.ProjectRequest; +import io.spring.initializr.metadata.Dependency; +import org.junit.Test; + +/** + * Tests for {@link JacksonKotlinRequestPostProcessor}. + * + * @author Sebastien Deleuze + * @author Stephane Nicoll + */ +public class JacksonKotlinRequestPostProcessorTests + extends AbstractRequestPostProcessorTests { + + static final Dependency JACKSON_KOTLIN = Dependency.withId("jackson-module-kotlin", + "com.fasterxml.jackson.module", "jackson-module-kotlin"); + + static final Dependency REACTOR_TEST = Dependency.create( + "io.projectreactor", "reactor-test", null, Dependency.SCOPE_TEST); + + @Test + public void jacksonModuleKotlinIsAdded() { + ProjectRequest request = createProjectRequest("webflux"); + request.setBootVersion("2.0.0.M2"); + request.setLanguage("kotlin"); + generateMavenPom(request) + .hasSpringBootStarterDependency("webflux") + .hasDependency(JACKSON_KOTLIN) + .hasSpringBootStarterTest() + .hasDependency(REACTOR_TEST) + .hasDependency("org.jetbrains.kotlin", "kotlin-reflect") + .hasDependency("org.jetbrains.kotlin", "kotlin-stdlib-jdk8") + .hasDependenciesCount(6); + } + + @Test + public void jacksonModuleKotlinIsNotAddedWithoutKotlin() { + ProjectRequest request = createProjectRequest("webflux"); + request.setBootVersion("2.0.0.M2"); + generateMavenPom(request) + .hasSpringBootStarterDependency("webflux") + .hasSpringBootStarterTest() + .hasDependency(REACTOR_TEST) + .hasDependenciesCount(3); + } + + @Test + public void jacksonModuleKotlinIsNotAddedWithoutJsonFacet() { + ProjectRequest request = createProjectRequest("actuator"); + request.setBootVersion("2.0.0.M2"); + request.setLanguage("kotlin"); + generateMavenPom(request) + .hasSpringBootStarterDependency("actuator") + .hasSpringBootStarterTest() + .hasDependency("org.jetbrains.kotlin", "kotlin-reflect") + .hasDependency("org.jetbrains.kotlin", "kotlin-stdlib-jdk8") + .hasDependenciesCount(4); + } + +}