diff --git a/spring-boot-project/spring-boot-docs/src/main/asciidoc/production-ready-features.adoc b/spring-boot-project/spring-boot-docs/src/main/asciidoc/production-ready-features.adoc index 4eaced70057a..3092da2d73b2 100644 --- a/spring-boot-project/spring-boot-docs/src/main/asciidoc/production-ready-features.adoc +++ b/spring-boot-project/spring-boot-docs/src/main/asciidoc/production-ready-features.adoc @@ -532,11 +532,10 @@ JSON request body. When exposed via JMX, the parameters are mapped to the parame the MBean's operations. Parameters are required by default. They can be made optional by annotating them with `@org.springframework.lang.Nullable`. -NOTE: To allow the input to be mapped to the operation method's parameters, code -implementing an endpoint should be compiled with `-parameters`. This will happen -automatically if you are using Spring Boot's Gradle plugin or if you are using Maven -and `spring-boot-starter-parent`. - +NOTE: To allow the input to be mapped to the operation method's parameters, java code +implementing an endpoint should be compiled with `-parameters`, and kotlin code should +be compiled with `-java-parameters`. This will happen automatically if you are using +Spring Boot's Gradle plugin or if you are using Maven and `spring-boot-starter-parent`. [[production-ready-endpoints-custom-input-conversion]] diff --git a/spring-boot-project/spring-boot-parent/pom.xml b/spring-boot-project/spring-boot-parent/pom.xml index 2b7aa47837cd..72c31c2c59f2 100644 --- a/spring-boot-project/spring-boot-parent/pom.xml +++ b/spring-boot-project/spring-boot-parent/pom.xml @@ -294,6 +294,7 @@ ${java.version} 1.1 1.1 + true diff --git a/spring-boot-project/spring-boot-starters/spring-boot-starter-parent/pom.xml b/spring-boot-project/spring-boot-starters/spring-boot-starter-parent/pom.xml index c9a8e676859c..393a528e353b 100644 --- a/spring-boot-project/spring-boot-starters/spring-boot-starter-parent/pom.xml +++ b/spring-boot-project/spring-boot-starters/spring-boot-starter-parent/pom.xml @@ -51,6 +51,7 @@ ${kotlin.version} ${java.version} + true diff --git a/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/main/asciidoc/reacting.adoc b/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/main/asciidoc/reacting.adoc index 942af60367c2..063d55b459e1 100644 --- a/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/main/asciidoc/reacting.adoc +++ b/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/main/asciidoc/reacting.adoc @@ -24,7 +24,7 @@ plugin: the `bootJar` task. 6. Configures any `JavaCompile` tasks with no configured encoding to use `UTF-8`. 7. Configures any `JavaCompile` tasks to use the `-parameters` compiler argument. - +8. Configures any `KotlinCompile` tasks to use the `-java-parameters` compiler argument. [[reacting-to-other-plugins-kotlin]] diff --git a/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/main/java/org/springframework/boot/gradle/plugin/KotlinPluginAction.java b/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/main/java/org/springframework/boot/gradle/plugin/KotlinPluginAction.java index 13c6e213ec19..700c5ce6d358 100644 --- a/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/main/java/org/springframework/boot/gradle/plugin/KotlinPluginAction.java +++ b/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/main/java/org/springframework/boot/gradle/plugin/KotlinPluginAction.java @@ -20,6 +20,7 @@ import org.gradle.api.Project; import org.gradle.api.plugins.ExtraPropertiesExtension; import org.jetbrains.kotlin.gradle.plugin.KotlinPluginWrapper; +import org.jetbrains.kotlin.gradle.tasks.KotlinCompile; /** * {@link PluginApplicationAction} that reacts to Kotlin's Gradle plugin being applied by @@ -39,6 +40,13 @@ public void execute(Project project) { if (!extraProperties.has("kotlin.version")) { extraProperties.set("kotlin.version", kotlinVersion); } + enableJavaParametersOption(project); + } + + private void enableJavaParametersOption(Project project) { + project.getTasks().withType(KotlinCompile.class, (compile) -> { + compile.getKotlinOptions().setJavaParameters(true); + }); } @Override diff --git a/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/test/java/org/springframework/boot/gradle/plugin/KotlinPluginActionIntegrationTests.java b/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/test/java/org/springframework/boot/gradle/plugin/KotlinPluginActionIntegrationTests.java index 3f877315f0de..97b8322c5fcd 100644 --- a/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/test/java/org/springframework/boot/gradle/plugin/KotlinPluginActionIntegrationTests.java +++ b/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/test/java/org/springframework/boot/gradle/plugin/KotlinPluginActionIntegrationTests.java @@ -52,4 +52,17 @@ public void kotlinVersionMatchesKotlinPluginVersion() { .containsPattern("org.jetbrains.kotlin:kotlin-stdlib-jdk8:* -> 1.2.10"); } + @Test + public void kotlinCompileTasksUseJavaParametersFlagByDefault() { + assertThat(this.gradleBuild.build("kotlinCompileTasksJavaParameters").getOutput()) + .contains("compileKotlin java parameters: true") + .contains("compileTestKotlin java parameters: true"); + } + + @Test + public void kotlinCompileTasksCanOverrideDefaultJavaParametersFlag() { + assertThat(this.gradleBuild.build("kotlinCompileTasksJavaParameters").getOutput()) + .contains("compileKotlin java parameters: false") + .contains("compileTestKotlin java parameters: false"); + } } diff --git a/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/test/resources/org/springframework/boot/gradle/plugin/KotlinPluginActionIntegrationTests-kotlinCompileTasksCanOverrideDefaultJavaParametersFlag.gradle b/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/test/resources/org/springframework/boot/gradle/plugin/KotlinPluginActionIntegrationTests-kotlinCompileTasksCanOverrideDefaultJavaParametersFlag.gradle new file mode 100644 index 000000000000..fc6b58756f44 --- /dev/null +++ b/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/test/resources/org/springframework/boot/gradle/plugin/KotlinPluginActionIntegrationTests-kotlinCompileTasksCanOverrideDefaultJavaParametersFlag.gradle @@ -0,0 +1,25 @@ +buildscript { + dependencies { + classpath files(pluginClasspath.split(',')) + } +} + +plugins { + id 'org.jetbrains.kotlin.jvm' version '1.2.10' +} + +apply plugin: 'org.springframework.boot' + +import org.jetbrains.kotlin.gradle.dsl.KotlinCompile + +tasks.withType(KotlinCompile) { + kotlinOptions.javaParameters = false +} + +task('kotlinCompileTasksJavaParameters') { + doFirst { + tasks.withType(KotlinCompile) { + println "$name java parameters: ${kotlinOptions.javaParameters}" + } + } +} diff --git a/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/test/resources/org/springframework/boot/gradle/plugin/KotlinPluginActionIntegrationTests-kotlinCompileTasksUseJavaParametersFlagByDefault.gradle b/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/test/resources/org/springframework/boot/gradle/plugin/KotlinPluginActionIntegrationTests-kotlinCompileTasksUseJavaParametersFlagByDefault.gradle new file mode 100644 index 000000000000..bce41d11bd04 --- /dev/null +++ b/spring-boot-project/spring-boot-tools/spring-boot-gradle-plugin/src/test/resources/org/springframework/boot/gradle/plugin/KotlinPluginActionIntegrationTests-kotlinCompileTasksUseJavaParametersFlagByDefault.gradle @@ -0,0 +1,21 @@ +buildscript { + dependencies { + classpath files(pluginClasspath.split(',')) + } +} + +plugins { + id 'org.jetbrains.kotlin.jvm' version '1.2.10' +} + +apply plugin: 'org.springframework.boot' + +import org.jetbrains.kotlin.gradle.dsl.KotlinCompile + +task('kotlinCompileTasksJavaParameters') { + doFirst { + tasks.withType(KotlinCompile) { + println "$name java parameters: ${kotlinOptions.javaParameters}" + } + } +}