Skip to content

Commit eb1b70b

Browse files
Add Preliminary Support for Java Records (#8)
* Switch to using Spring's BeanUtils for feteching introspection data * Use Java 17 as the required compiler version. * Set the bytecode to Java 8 for main compiler output. * Use Java 17 bytecode for integration tests. * Update README with build updates * Preliminary support for Java records. This support depends on the constructor binding support found in Spring MVC and WebFlux already. Nested binding is not supported in this iteration. * Assert not null. * Get branch up to date with latest from main. * Update javadoc. * Get rid of kotlin compile warning. * Add webmvc integration tests for java record support. * Add webflux integration tests for java record support. * Update Spring dependency versions. * Update notes. * Don't start a daemon. * Use direct interface for constant. * Try to use aggregated report for coverage. * Fix filename. * Skip install phase.
1 parent ccea449 commit eb1b70b

File tree

56 files changed

+689
-198
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

56 files changed

+689
-198
lines changed

.travis.yml

Lines changed: 2 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
language: java
2+
install: skip
23

34
addons:
45
sonarcloud:
@@ -8,12 +9,6 @@ addons:
89

910
jobs:
1011
include:
11-
- name: OpenJDK 8
12-
jdk: openjdk8
13-
script: ./gradlew jacocoTestReport check
14-
- name: OpenJDK 11
15-
jdk: openjdk11
16-
script: ./gradlew jacocoTestReport sonarqube
1712
- name: OpenJDK 17
1813
jdk: openjdk17
19-
script: ./gradlew jacocoTestReport check
14+
script: ./gradlew --no-daemon jacocoTestReport testCodeCoverageReport sonarqube

README.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -161,6 +161,10 @@ public BinderConfiguration binderConfiguration() {
161161

162162
## Build
163163

164+
### Build Requirements
165+
166+
* Java 17 or above to build. The release jars are compiled to Java 8 bytecode. Integration tests are compiled to Java 17 bytecode.
167+
164168
To build:
165169

166170
```shell

RELEASE_NOTES.md

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,12 @@
11
# Release Notes
22

3+
## 0.5.0
4+
IN PROGRESS
5+
6+
- Added preliminary support for Java records.
7+
- JDK 17 is now required to build this project. The production artifacts are still compiled to Java 1.8 bytecode.
8+
- Upgraded to equals verifier 3.10
9+
310
## 0.4.0
411
Released 2021-06-20
512

build.gradle.kts

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -6,16 +6,16 @@ plugins {
66
id("org.sonarqube") version "3.3"
77
}
88

9-
val springVersion = "5.3.8"
10-
val springBootVersion = "2.4.7"
9+
val springVersion = "5.3.13"
10+
val springBootVersion = "2.4.13"
1111

1212
val rootJacocoDir by extra("${rootProject.buildDir}/reports/jacoco/testCodeCoverageReport")
13-
val reportXmlFile by extra("$rootJacocoDir/jacocoTestReport.xml")
13+
val reportXmlFile by extra("$rootJacocoDir/testCodeCoverageReport.xml")
1414

1515
val javadocLinks = arrayOf(
1616
"https://docs.oracle.com/javase/8/docs/api/",
1717
"https://docs.oracle.com/javaee/7/api/",
18-
"https://docs.spring.io/spring/docs/$springVersion/javadoc-api/",
18+
"https://docs.spring.io/spring-framework/docs/$springVersion/javadoc-api/",
1919
"https://docs.spring.io/spring-boot/docs/$springBootVersion/api/"
2020
)
2121

@@ -36,10 +36,14 @@ subprojects {
3636

3737
java {
3838
toolchain {
39-
languageVersion.set(JavaLanguageVersion.of(8))
39+
languageVersion.set(JavaLanguageVersion.of(17))
4040
}
4141
}
4242

43+
tasks.compileJava {
44+
options.release.set(8)
45+
}
46+
4347
// sourceCompatibility = 1.8
4448

4549
dependencies {
@@ -55,7 +59,7 @@ subprojects {
5559
// Test
5660
implementation(platform("org.junit:junit-bom:5.6.1"))
5761
implementation(platform("org.assertj:assertj-core:3.15.0"))
58-
implementation(platform("nl.jqno.equalsverifier:equalsverifier:3.1.13"))
62+
implementation(platform("nl.jqno.equalsverifier:equalsverifier:3.10"))
5963
implementation(platform("org.mockito:mockito-core:3.3.3"))
6064
}
6165

@@ -121,6 +125,6 @@ dependencies {
121125
sonarqube {
122126
properties {
123127
property("sonar.projectKey", "mattbertolini_spring-annotated-web-data-binder")
124-
// property "sonar.coverage.jacoco.xmlReportPaths", reportXmlFile
128+
property("sonar.coverage.jacoco.xmlReportPaths", reportXmlFile)
125129
}
126130
}

buildSrc/build.gradle.kts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,12 @@ plugins {
22
`kotlin-dsl`
33
}
44

5+
tasks.withType<org.jetbrains.kotlin.gradle.tasks.KotlinCompile> {
6+
kotlinOptions {
7+
jvmTarget = "1.8"
8+
}
9+
}
10+
511
repositories {
612
mavenCentral()
713
}

integration-tests/build.gradle.kts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,10 @@ dependencies {
1818
testCompileOnly("org.hamcrest:hamcrest") // Version defined in Spring BOM file
1919
}
2020

21+
tasks.compileJava {
22+
options.release.set(17)
23+
}
24+
2125
tasks.jacocoTestReport {
2226
reports {
2327
html.required.set(false)

integration-tests/src/test/java/com/mattbertolini/spring/test/web/bind/CookieParameterController.java

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright 2019-2020 the original author or authors.
2+
* Copyright 2019-2022 the original author or authors.
33
*
44
* Licensed under the Apache License, Version 2.0 (the "License");
55
* you may not use this file except in compliance with the License.
@@ -16,6 +16,7 @@
1616

1717
package com.mattbertolini.spring.test.web.bind;
1818

19+
import com.mattbertolini.spring.test.web.bind.records.CookieParameterRecord;
1920
import com.mattbertolini.spring.web.bind.annotation.BeanParameter;
2021
import org.springframework.http.MediaType;
2122
import org.springframework.validation.BindingResult;
@@ -63,4 +64,9 @@ public String validatedWithBindingResult(@Valid @BeanParameter CookieParameterBe
6364
public String nestedBean(@BeanParameter CookieParameterBean cookieParameterBean) {
6465
return cookieParameterBean.getNestedBean().getCookieValue();
6566
}
67+
68+
@GetMapping(value = "/record", produces = MediaType.TEXT_PLAIN_VALUE)
69+
public String javaRecord(@BeanParameter CookieParameterRecord cookieParameterRecord) {
70+
return cookieParameterRecord.annotated();
71+
}
6672
}

integration-tests/src/test/java/com/mattbertolini/spring/test/web/bind/FormParameterController.java

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright 2019-2021 the original author or authors.
2+
* Copyright 2019-2022 the original author or authors.
33
*
44
* Licensed under the Apache License, Version 2.0 (the "License");
55
* you may not use this file except in compliance with the License.
@@ -16,6 +16,7 @@
1616

1717
package com.mattbertolini.spring.test.web.bind;
1818

19+
import com.mattbertolini.spring.test.web.bind.records.FormParameterRecord;
1920
import com.mattbertolini.spring.web.bind.annotation.BeanParameter;
2021
import org.springframework.core.io.buffer.DataBuffer;
2122
import org.springframework.core.io.buffer.DataBufferUtils;
@@ -164,4 +165,9 @@ public String webFluxFilePart(@BeanParameter FormParameterBean.WebfluxMultipartB
164165
public String nestedBeanParameter(@BeanParameter FormParameterBean formParameterBean) {
165166
return formParameterBean.getNestedBean().getFormData();
166167
}
168+
169+
@PostMapping(value = "/record", produces = MediaType.TEXT_PLAIN_VALUE)
170+
public String javaRecord(@BeanParameter FormParameterRecord formParameterRecord) {
171+
return formParameterRecord.annotated();
172+
}
167173
}

integration-tests/src/test/java/com/mattbertolini/spring/test/web/bind/HeaderParameterController.java

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright 2019-2020 the original author or authors.
2+
* Copyright 2019-2022 the original author or authors.
33
*
44
* Licensed under the Apache License, Version 2.0 (the "License");
55
* you may not use this file except in compliance with the License.
@@ -16,6 +16,7 @@
1616

1717
package com.mattbertolini.spring.test.web.bind;
1818

19+
import com.mattbertolini.spring.test.web.bind.records.HeaderParameterRecord;
1920
import com.mattbertolini.spring.web.bind.annotation.BeanParameter;
2021
import org.springframework.http.HttpHeaders;
2122
import org.springframework.http.MediaType;
@@ -84,4 +85,9 @@ public String validatedWithBindingResult(@Valid @BeanParameter HeaderParameterBe
8485
public String nestedBean(@BeanParameter HeaderParameterBean headerParameterBean) {
8586
return headerParameterBean.getNestedBean().getHeaderValue();
8687
}
88+
89+
@GetMapping(value = "/record", produces = MediaType.TEXT_PLAIN_VALUE)
90+
public String javaRecord(@BeanParameter HeaderParameterRecord headerParameterRecord) {
91+
return headerParameterRecord.annotated();
92+
}
8793
}

integration-tests/src/test/java/com/mattbertolini/spring/test/web/bind/PathParameterController.java

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright 2019-2020 the original author or authors.
2+
* Copyright 2019-2022 the original author or authors.
33
*
44
* Licensed under the Apache License, Version 2.0 (the "License");
55
* you may not use this file except in compliance with the License.
@@ -16,6 +16,7 @@
1616

1717
package com.mattbertolini.spring.test.web.bind;
1818

19+
import com.mattbertolini.spring.test.web.bind.records.PathParameterRecord;
1920
import com.mattbertolini.spring.web.bind.annotation.BeanParameter;
2021
import org.springframework.http.MediaType;
2122
import org.springframework.validation.BindingResult;
@@ -71,4 +72,9 @@ public String validatedWithBindingResult(@Valid @BeanParameter PathParameterBean
7172
public String nestedBean(@BeanParameter PathParameterBean pathParameterBean) {
7273
return pathParameterBean.getNestedBean().getPathVariable();
7374
}
75+
76+
@GetMapping(value = "/record/{annotated_field}", produces = MediaType.TEXT_PLAIN_VALUE)
77+
public String javaRecord(@BeanParameter PathParameterRecord pathParameterRecord) {
78+
return pathParameterRecord.annotated();
79+
}
7480
}

0 commit comments

Comments
 (0)