Upgrade to Spring Framework 6 and Jakarta EE 9

Closes gh-750
Closes gh-748
This commit is contained in:
Andy Wilkinson
2021-09-28 15:01:55 +01:00
parent 68ff043fb3
commit 4223f70102
37 changed files with 147 additions and 217 deletions

View File

@@ -25,10 +25,10 @@ nohttp {
}
ext {
springVersion = "5.0.15.RELEASE"
springFrameworkVersion = "6.0.0-SNAPSHOT"
javadocLinks = [
"https://docs.oracle.com/javase/8/docs/api/",
"https://docs.spring.io/spring-framework/docs/$springVersion/javadoc-api/",
"https://docs.spring.io/spring-framework/docs/$springFrameworkVersion/javadoc-api/",
"https://docs.jboss.org/hibernate/stable/beanvalidation/api/",
"https://docs.jboss.org/hibernate/stable/validator/api/"
] as String[]

View File

@@ -16,13 +16,13 @@ dependencies {
asciidoctorExt("io.spring.asciidoctor:spring-asciidoctor-extensions-block-switch:0.5.0")
internal(platform(project(":spring-restdocs-platform")))
internal(enforcedPlatform("org.springframework:spring-framework-bom:5.3.8"))
internal(enforcedPlatform("org.springframework:spring-framework-bom:$springFrameworkVersion"))
testImplementation(project(":spring-restdocs-mockmvc"))
testImplementation(project(":spring-restdocs-restassured"))
testImplementation(project(":spring-restdocs-webtestclient"))
testImplementation("io.rest-assured:rest-assured")
testImplementation("javax.validation:validation-api")
testImplementation("jakarta.validation:jakarta.validation-api")
testImplementation("junit:junit")
testImplementation("org.testng:testng:6.9.10")
testImplementation("org.junit.jupiter:junit-jupiter-api")

View File

@@ -1252,7 +1252,7 @@ example of such a resource bundle].
Each key in the resource bundle is the fully-qualified name of a constraint plus a
`.description`. For example, the key for the standard `@NotNull` constraint is
`javax.validation.constraints.NotNull.description`.
`jakarta.validation.constraints.NotNull.description`.
You can use a property placeholder referring to a constraint's attributes in its
description. For example, the default description of the `@Min` constraint,
@@ -1318,7 +1318,7 @@ You can configure which snippets are produced by default. See the
=== Using Parameterized Output Directories
When using MockMvc, REST Assured, or `WebTestClient` you can parameterize the output directory used by
`document`. Parameterizing output with `WebTestClient` requires Spring Framework 5.3.5 or later.
`document`.
The following parameters are supported:

View File

@@ -77,7 +77,7 @@ If you want to jump straight in, a number of sample applications are available:
Spring REST Docs has the following minimum requirements:
* Java 17
* Spring Framework 5 (5.0.2 or later)
* Spring Framework 6
Additionally, the `spring-restdocs-restassured` module requires REST Assured 4 (4.4 or later).

View File

@@ -18,8 +18,8 @@ package com.example;
import java.util.List;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;
import jakarta.validation.constraints.NotNull;
import jakarta.validation.constraints.Size;
import org.springframework.restdocs.constraints.ConstraintDescriptions;

View File

@@ -38,7 +38,7 @@ import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;
import javax.servlet.RequestDispatcher;
import jakarta.servlet.RequestDispatcher;
import org.junit.Before;
import org.junit.Rule;

View File

@@ -37,7 +37,7 @@ import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;
import javax.servlet.RequestDispatcher;
import jakarta.servlet.RequestDispatcher;
import org.junit.Before;
import org.junit.Rule;

View File

@@ -32,7 +32,7 @@ class ExceptionSupressingErrorAttributes extends DefaultErrorAttributes {
ErrorAttributeOptions options) {
Map<String, Object> errorAttributes = super.getErrorAttributes(webRequest, options);
errorAttributes.remove("exception");
Object message = webRequest.getAttribute("javax.servlet.error.message", RequestAttributes.SCOPE_REQUEST);
Object message = webRequest.getAttribute("jakarta.servlet.error.message", RequestAttributes.SCOPE_REQUEST);
if (message != null) {
errorAttributes.put("message", message);
}

View File

@@ -20,7 +20,7 @@ import java.net.URI;
import java.util.Collections;
import java.util.List;
import javax.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotBlank;
import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonProperty;

View File

@@ -21,10 +21,10 @@ import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import javax.validation.Constraint;
import javax.validation.Payload;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.Null;
import jakarta.validation.Constraint;
import jakarta.validation.Payload;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.Null;
import org.hibernate.validator.constraints.CompositionType;
import org.hibernate.validator.constraints.ConstraintComposition;

View File

@@ -18,8 +18,8 @@ package com.example.notes;
import java.io.IOException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import org.springframework.http.HttpStatus;
import org.springframework.web.bind.annotation.ControllerAdvice;

View File

@@ -16,7 +16,7 @@
package com.example.notes;
import javax.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotBlank;
import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonProperty;

View File

@@ -42,7 +42,7 @@ import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;
import javax.servlet.RequestDispatcher;
import jakarta.servlet.RequestDispatcher;
import org.junit.Before;
import org.junit.Rule;

View File

@@ -20,9 +20,9 @@ import static org.assertj.core.api.Assertions.assertThat;
import java.util.Set;
import javax.validation.ConstraintViolation;
import javax.validation.Validation;
import javax.validation.Validator;
import jakarta.validation.ConstraintViolation;
import jakarta.validation.Validation;
import jakarta.validation.Validator;
import org.junit.Test;

View File

@@ -46,11 +46,11 @@ dependencies {
optional(platform(project(":spring-restdocs-platform")))
optional("commons-codec:commons-codec")
optional("javax.validation:validation-api")
optional("jakarta.validation:jakarta.validation-api")
optional("junit:junit")
optional("org.hibernate.validator:hibernate-validator")
optional("org.junit.jupiter:junit-jupiter-api")
testFixturesApi(platform(project(":spring-restdocs-platform")))
testFixturesApi("junit:junit")
testFixturesApi("org.assertj:assertj-core")
@@ -68,7 +68,7 @@ dependencies {
testImplementation("org.hamcrest:hamcrest-library")
testImplementation("org.springframework:spring-test")
testRuntimeOnly("org.glassfish:javax.el:3.0.0")
testRuntimeOnly("org.glassfish:jakarta.el:4.0.2")
}
jar {
@@ -85,10 +85,3 @@ components.java.withVariantsFromConfiguration(configurations.testFixturesApiElem
components.java.withVariantsFromConfiguration(configurations.testFixturesRuntimeElements) {
skip()
}
compatibilityTest {
dependency("Spring Framework") { springFramework ->
springFramework.groupId = "org.springframework"
springFramework.versions = ["5.1.+", "5.2.+", "5.3.+"]
}
}

View File

@@ -20,29 +20,28 @@ import java.util.Locale;
import java.util.MissingResourceException;
import java.util.ResourceBundle;
import javax.validation.constraints.AssertFalse;
import javax.validation.constraints.AssertTrue;
import javax.validation.constraints.DecimalMax;
import javax.validation.constraints.DecimalMin;
import javax.validation.constraints.Digits;
import javax.validation.constraints.Email;
import javax.validation.constraints.Future;
import javax.validation.constraints.FutureOrPresent;
import javax.validation.constraints.Max;
import javax.validation.constraints.Min;
import javax.validation.constraints.Negative;
import javax.validation.constraints.NegativeOrZero;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotEmpty;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Null;
import javax.validation.constraints.Past;
import javax.validation.constraints.PastOrPresent;
import javax.validation.constraints.Pattern;
import javax.validation.constraints.Positive;
import javax.validation.constraints.PositiveOrZero;
import javax.validation.constraints.Size;
import jakarta.validation.constraints.AssertFalse;
import jakarta.validation.constraints.AssertTrue;
import jakarta.validation.constraints.DecimalMax;
import jakarta.validation.constraints.DecimalMin;
import jakarta.validation.constraints.Digits;
import jakarta.validation.constraints.Email;
import jakarta.validation.constraints.Future;
import jakarta.validation.constraints.FutureOrPresent;
import jakarta.validation.constraints.Max;
import jakarta.validation.constraints.Min;
import jakarta.validation.constraints.Negative;
import jakarta.validation.constraints.NegativeOrZero;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotEmpty;
import jakarta.validation.constraints.NotNull;
import jakarta.validation.constraints.Null;
import jakarta.validation.constraints.Past;
import jakarta.validation.constraints.PastOrPresent;
import jakarta.validation.constraints.Pattern;
import jakarta.validation.constraints.Positive;
import jakarta.validation.constraints.PositiveOrZero;
import jakarta.validation.constraints.Size;
import org.hibernate.validator.constraints.CodePointLength;
import org.hibernate.validator.constraints.CreditCardNumber;
import org.hibernate.validator.constraints.Currency;
@@ -52,7 +51,6 @@ import org.hibernate.validator.constraints.LuhnCheck;
import org.hibernate.validator.constraints.Mod10Check;
import org.hibernate.validator.constraints.Mod11Check;
import org.hibernate.validator.constraints.Range;
import org.hibernate.validator.constraints.SafeHtml;
import org.hibernate.validator.constraints.URL;
import org.springframework.util.PropertyPlaceholderHelper;
@@ -63,8 +61,8 @@ import org.springframework.util.StringUtils;
* A {@link ConstraintDescriptionResolver} that resolves constraint descriptions from a
* {@link ResourceBundle}. The resource bundle's keys are the name of the constraint with
* {@code .description} appended. For example, the key for the constraint named
* {@code javax.validation.constraints.NotNull} is
* {@code javax.validation.constraints.NotNull.description}.
* {@code jakarta.validation.constraints.NotNull} is
* {@code jakarta.validation.constraints.NotNull.description}.
* <p>
* Default descriptions are provided for Bean Validation 2.0's constraints:
*
@@ -109,7 +107,6 @@ import org.springframework.util.StringUtils;
* <li>{@link org.hibernate.validator.constraints.NotBlank}
* <li>{@link org.hibernate.validator.constraints.NotEmpty}
* <li>{@link Range}
* <li>{@link SafeHtml}
* <li>{@link URL}
* </ul>
*

View File

@@ -19,19 +19,19 @@ package org.springframework.restdocs.constraints;
import java.util.ArrayList;
import java.util.List;
import javax.validation.Validation;
import javax.validation.Validator;
import javax.validation.ValidatorFactory;
import javax.validation.constraints.NotNull;
import javax.validation.metadata.BeanDescriptor;
import javax.validation.metadata.ConstraintDescriptor;
import javax.validation.metadata.PropertyDescriptor;
import jakarta.validation.Validation;
import jakarta.validation.Validator;
import jakarta.validation.ValidatorFactory;
import jakarta.validation.constraints.NotNull;
import jakarta.validation.metadata.BeanDescriptor;
import jakarta.validation.metadata.ConstraintDescriptor;
import jakarta.validation.metadata.PropertyDescriptor;
/**
* A {@link ConstraintResolver} that uses a Bean Validation {@link Validator} to resolve
* constraints. The name of the constraint is the fully-qualified class name of the
* constraint annotation. For example, a {@link NotNull} constraint will be named
* {@code javax.validation.constraints.NotNull}.
* {@code jakarta.validation.constraints.NotNull}.
*
* @author Andy Wilkinson
*

View File

@@ -1,25 +1,25 @@
javax.validation.constraints.AssertFalse.description=Must be false
javax.validation.constraints.AssertTrue.description=Must be true
javax.validation.constraints.DecimalMax.description=Must be at most ${value}
javax.validation.constraints.DecimalMin.description=Must be at least ${value}
javax.validation.constraints.Digits.description=Must have at most ${integer} integral digits and ${fraction} fractional digits
javax.validation.constraints.Email.description=Must be a well-formed email address
javax.validation.constraints.Future.description=Must be in the future
javax.validation.constraints.FutureOrPresent.description=Must be in the future or the present
javax.validation.constraints.Max.description=Must be at most ${value}
javax.validation.constraints.Min.description=Must be at least ${value}
javax.validation.constraints.Negative.description=Must be negative
javax.validation.constraints.NegativeOrZero.description=Must be negative or zero
javax.validation.constraints.NotBlank.description=Must not be blank
javax.validation.constraints.NotEmpty.description=Must not be empty
javax.validation.constraints.NotNull.description=Must not be null
javax.validation.constraints.Null.description=Must be null
javax.validation.constraints.Past.description=Must be in the past
javax.validation.constraints.PastOrPresent.description=Must be in the past or the present
javax.validation.constraints.Pattern.description=Must match the regular expression `${regexp}`
javax.validation.constraints.Positive.description=Must be positive
javax.validation.constraints.PositiveOrZero.description=Must be positive or zero
javax.validation.constraints.Size.description=Size must be between ${min} and ${max} inclusive
jakarta.validation.constraints.AssertFalse.description=Must be false
jakarta.validation.constraints.AssertTrue.description=Must be true
jakarta.validation.constraints.DecimalMax.description=Must be at most ${value}
jakarta.validation.constraints.DecimalMin.description=Must be at least ${value}
jakarta.validation.constraints.Digits.description=Must have at most ${integer} integral digits and ${fraction} fractional digits
jakarta.validation.constraints.Email.description=Must be a well-formed email address
jakarta.validation.constraints.Future.description=Must be in the future
jakarta.validation.constraints.FutureOrPresent.description=Must be in the future or the present
jakarta.validation.constraints.Max.description=Must be at most ${value}
jakarta.validation.constraints.Min.description=Must be at least ${value}
jakarta.validation.constraints.Negative.description=Must be negative
jakarta.validation.constraints.NegativeOrZero.description=Must be negative or zero
jakarta.validation.constraints.NotBlank.description=Must not be blank
jakarta.validation.constraints.NotEmpty.description=Must not be empty
jakarta.validation.constraints.NotNull.description=Must not be null
jakarta.validation.constraints.Null.description=Must be null
jakarta.validation.constraints.Past.description=Must be in the past
jakarta.validation.constraints.PastOrPresent.description=Must be in the past or the present
jakarta.validation.constraints.Pattern.description=Must match the regular expression `${regexp}`
jakarta.validation.constraints.Positive.description=Must be positive
jakarta.validation.constraints.PositiveOrZero.description=Must be positive or zero
jakarta.validation.constraints.Size.description=Size must be between ${min} and ${max} inclusive
org.hibernate.validator.constraints.CodePointLength.description=Code point length must be between ${min} and ${max} inclusive
org.hibernate.validator.constraints.CreditCardNumber.description=Must be a well-formed credit card number
org.hibernate.validator.constraints.Currency.description=Must be in an accepted currency unit (${value})
@@ -32,5 +32,4 @@ org.hibernate.validator.constraints.Mod11Check.description=Must pass the Mod11 c
org.hibernate.validator.constraints.NotBlank.description=Must not be blank
org.hibernate.validator.constraints.NotEmpty.description=Must not be empty
org.hibernate.validator.constraints.Range.description=Must be at least ${min} and at most ${max}
org.hibernate.validator.constraints.SafeHtml.description=Must be safe HTML
org.hibernate.validator.constraints.URL.description=Must be a well-formed URL

View File

@@ -26,29 +26,29 @@ import java.util.ListResourceBundle;
import java.util.ResourceBundle;
import javax.money.MonetaryAmount;
import javax.validation.constraints.AssertFalse;
import javax.validation.constraints.AssertTrue;
import javax.validation.constraints.DecimalMax;
import javax.validation.constraints.DecimalMin;
import javax.validation.constraints.Digits;
import javax.validation.constraints.Email;
import javax.validation.constraints.Future;
import javax.validation.constraints.FutureOrPresent;
import javax.validation.constraints.Max;
import javax.validation.constraints.Min;
import javax.validation.constraints.Negative;
import javax.validation.constraints.NegativeOrZero;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotEmpty;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Null;
import javax.validation.constraints.Past;
import javax.validation.constraints.PastOrPresent;
import javax.validation.constraints.Pattern;
import javax.validation.constraints.Positive;
import javax.validation.constraints.PositiveOrZero;
import javax.validation.constraints.Size;
import jakarta.validation.constraints.AssertFalse;
import jakarta.validation.constraints.AssertTrue;
import jakarta.validation.constraints.DecimalMax;
import jakarta.validation.constraints.DecimalMin;
import jakarta.validation.constraints.Digits;
import jakarta.validation.constraints.Email;
import jakarta.validation.constraints.Future;
import jakarta.validation.constraints.FutureOrPresent;
import jakarta.validation.constraints.Max;
import jakarta.validation.constraints.Min;
import jakarta.validation.constraints.Negative;
import jakarta.validation.constraints.NegativeOrZero;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotEmpty;
import jakarta.validation.constraints.NotNull;
import jakarta.validation.constraints.Null;
import jakarta.validation.constraints.Past;
import jakarta.validation.constraints.PastOrPresent;
import jakarta.validation.constraints.Pattern;
import jakarta.validation.constraints.Positive;
import jakarta.validation.constraints.PositiveOrZero;
import jakarta.validation.constraints.Size;
import org.hibernate.validator.constraints.CodePointLength;
import org.hibernate.validator.constraints.CreditCardNumber;
import org.hibernate.validator.constraints.Currency;
@@ -58,7 +58,6 @@ import org.hibernate.validator.constraints.LuhnCheck;
import org.hibernate.validator.constraints.Mod10Check;
import org.hibernate.validator.constraints.Mod11Check;
import org.hibernate.validator.constraints.Range;
import org.hibernate.validator.constraints.SafeHtml;
import org.junit.Test;
import org.springframework.core.annotation.AnnotationUtils;
@@ -253,11 +252,6 @@ public class ResourceBundleConstraintDescriptionResolverTests {
assertThat(constraintDescriptionForField("range")).isEqualTo("Must be at least 10 and at most 100");
}
@Test
public void defaultMessageSafeHtml() {
assertThat(constraintDescriptionForField("safeHtml")).isEqualTo("Must be safe HTML");
}
@Test
public void defaultMessageUrl() {
assertThat(constraintDescriptionForField("url")).isEqualTo("Must be a well-formed URL");
@@ -423,9 +417,6 @@ public class ResourceBundleConstraintDescriptionResolverTests {
@Range(min = 10, max = 100)
private int range;
@SafeHtml
private String safeHtml;
@org.hibernate.validator.constraints.URL
private String url;

View File

@@ -26,12 +26,11 @@ import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import javax.validation.Payload;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Null;
import javax.validation.constraints.Size;
import jakarta.validation.Payload;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotNull;
import jakarta.validation.constraints.Null;
import jakarta.validation.constraints.Size;
import org.assertj.core.api.Condition;
import org.assertj.core.description.TextDescription;
import org.hibernate.validator.constraints.CompositionType;
@@ -102,7 +101,7 @@ public class ValidatorConstraintResolverTests {
@NotBlank
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
@javax.validation.Constraint(validatedBy = {})
@jakarta.validation.Constraint(validatedBy = {})
private @interface CompositeConstraint {
String message() default "Must be null or not blank";

View File

@@ -1 +1 @@
javax.validation.constraints.NotNull.description=Should not be null
jakarta.validation.constraints.NotNull.description=Should not be null

View File

@@ -12,7 +12,7 @@ dependencies {
api("org.springframework:spring-webmvc")
api("org.springframework:spring-test")
implementation("javax.servlet:javax.servlet-api")
implementation("jakarta.servlet:jakarta.servlet-api")
internal(platform(project(":spring-restdocs-platform")))
@@ -25,10 +25,3 @@ dependencies {
testRuntimeOnly("commons-logging:commons-logging:1.2")
}
compatibilityTest {
dependency("Spring Framework") { springFramework ->
springFramework.groupId = "org.springframework"
springFramework.versions = ["5.1.+", "5.2.+", "5.3.+"]
}
}

View File

@@ -26,8 +26,8 @@ import java.util.Collections;
import java.util.List;
import java.util.Map.Entry;
import javax.servlet.ServletException;
import javax.servlet.http.Part;
import jakarta.servlet.ServletException;
import jakarta.servlet.http.Part;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpMethod;
@@ -89,7 +89,7 @@ class MockMvcRequestConverter implements RequestConverter<MockHttpServletRequest
return Collections.emptyList();
}
List<RequestCookie> cookies = new ArrayList<>();
for (javax.servlet.http.Cookie servletCookie : mockRequest.getCookies()) {
for (jakarta.servlet.http.Cookie servletCookie : mockRequest.getCookies()) {
cookies.add(new RequestCookie(servletCookie.getName(), servletCookie.getValue()));
}
headers.remove(HttpHeaders.COOKIE);

View File

@@ -16,7 +16,7 @@
package org.springframework.restdocs.mockmvc;
import javax.servlet.http.Cookie;
import jakarta.servlet.http.Cookie;
import org.springframework.http.HttpHeaders;
import org.springframework.mock.web.MockHttpServletResponse;

View File

@@ -21,8 +21,7 @@ import java.net.URI;
import java.util.Arrays;
import java.util.Iterator;
import javax.servlet.http.Part;
import jakarta.servlet.http.Part;
import org.junit.Test;
import org.springframework.http.HttpMethod;
@@ -85,8 +84,8 @@ public class MockMvcRequestConverterTests {
@Test
public void requestWithCookies() throws Exception {
OperationRequest request = createOperationRequest(
MockMvcRequestBuilders.get("/foo").cookie(new javax.servlet.http.Cookie("cookieName1", "cookieVal1"),
new javax.servlet.http.Cookie("cookieName2", "cookieVal2")));
MockMvcRequestBuilders.get("/foo").cookie(new jakarta.servlet.http.Cookie("cookieName1", "cookieVal1"),
new jakarta.servlet.http.Cookie("cookieName2", "cookieVal2")));
assertThat(request.getUri()).isEqualTo(URI.create("http://localhost/foo"));
assertThat(request.getMethod()).isEqualTo(HttpMethod.GET);
assertThat(request.getCookies().size()).isEqualTo(2);

View File

@@ -18,9 +18,8 @@ package org.springframework.restdocs.mockmvc;
import java.util.Collections;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletResponse;
import jakarta.servlet.http.Cookie;
import jakarta.servlet.http.HttpServletResponse;
import org.junit.Test;
import org.springframework.http.HttpHeaders;

View File

@@ -31,9 +31,8 @@ import java.util.Map;
import java.util.Set;
import java.util.regex.Pattern;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletResponse;
import jakarta.servlet.http.Cookie;
import jakarta.servlet.http.HttpServletResponse;
import org.assertj.core.api.Condition;
import org.junit.After;
import org.junit.Before;

View File

@@ -18,8 +18,7 @@ package org.springframework.restdocs.mockmvc;
import java.net.URI;
import javax.servlet.ServletContext;
import jakarta.servlet.ServletContext;
import org.junit.Test;
import org.springframework.http.HttpMethod;

View File

@@ -11,8 +11,8 @@ dependencies {
api("com.fasterxml.jackson.core:jackson-databind:2.9.5")
api("com.samskivert:jmustache:$jmustacheVersion")
api("commons-codec:commons-codec:1.10")
api("javax.servlet:javax.servlet-api:3.1.0")
api("javax.validation:validation-api:2.0.0.Final")
api("jakarta.servlet:jakarta.servlet-api:5.0.0")
api("jakarta.validation:jakarta.validation-api:3.0.0")
api("junit:junit:4.12")
api("io.rest-assured:rest-assured:4.4.0")
api("org.apache.pdfbox:pdfbox:2.0.7")
@@ -21,14 +21,13 @@ dependencies {
api("org.assertj:assertj-core:3.11.1")
api("org.hamcrest:hamcrest-core:1.3")
api("org.hamcrest:hamcrest-library:1.3")
api("org.hibernate.validator:hibernate-validator:6.0.9.Final")
api("org.hibernate.validator:hibernate-validator:7.0.0.Final")
api("org.jacoco:org.jacoco.agent:0.7.9")
api("org.javamoney:moneta:1.1")
api("org.jruby:jruby-complete:9.1.13.0")
api("org.junit.jupiter:junit-jupiter-api:5.0.0")
api("org.mockito:mockito-core:1.10.19")
api("org.springframework.hateoas:spring-hateoas:0.23.0.RELEASE")
api("org.synchronoss.cloud:nio-multipart-parser:1.1.0")
}
api(enforcedPlatform("org.springframework:spring-framework-bom:$springVersion"))
api(enforcedPlatform("org.springframework:spring-framework-bom:$springFrameworkVersion"))
}

View File

@@ -16,7 +16,7 @@ dependencies {
testImplementation(testFixtures(project(":spring-restdocs-core")))
testImplementation("com.fasterxml.jackson.core:jackson-databind")
testImplementation("junit:junit")
testImplementation("org.apache.tomcat.embed:tomcat-embed-core:8.5.13")
testImplementation("org.apache.tomcat.embed:tomcat-embed-core:10.0.11")
testImplementation("org.assertj:assertj-core")
testImplementation("org.hamcrest:hamcrest-library")
testImplementation("org.mockito:mockito-core")

View File

@@ -248,8 +248,9 @@ public class RestAssuredRestDocumentationIntegrationTests {
assertExpectedSnippetFilesExist(new File("build/generated-snippets/set-cookie"), "http-request.adoc",
"http-response.adoc", "curl-request.adoc");
assertThat(new File("build/generated-snippets/set-cookie/http-response.adoc"))
.has(content(httpResponse(TemplateFormats.asciidoctor(), HttpStatus.OK).header(HttpHeaders.SET_COOKIE,
"name=value; Domain=localhost; HttpOnly")));
.has(content(httpResponse(TemplateFormats.asciidoctor(), HttpStatus.OK)
.header(HttpHeaders.SET_COOKIE, "name=value; Domain=localhost; HttpOnly")
.header("Keep-Alive", "timeout=60").header("Connection", "keep-alive")));
}
@Test
@@ -307,7 +308,8 @@ public class RestAssuredRestDocumentationIntegrationTests {
assertThat(new File("build/generated-snippets/preprocessed-response/http-response.adoc"))
.has(content(httpResponse(TemplateFormats.asciidoctor(), HttpStatus.OK)
.header("Foo", "https://api.example.com/foo/bar")
.header("Content-Type", "application/json;charset=UTF-8")
.header("Content-Type", "application/json;charset=UTF-8").header("Keep-Alive", "timeout=60")
.header("Connection", "keep-alive")
.header(HttpHeaders.CONTENT_LENGTH, prettyPrinted.getBytes().length).content(prettyPrinted)));
}
@@ -326,7 +328,8 @@ public class RestAssuredRestDocumentationIntegrationTests {
assertThat(new File("build/generated-snippets/default-preprocessed-response/http-response.adoc"))
.has(content(httpResponse(TemplateFormats.asciidoctor(), HttpStatus.OK)
.header("Foo", "https://api.example.com/foo/bar")
.header("Content-Type", "application/json;charset=UTF-8")
.header("Content-Type", "application/json;charset=UTF-8").header("Keep-Alive", "timeout=60")
.header("Connection", "keep-alive")
.header(HttpHeaders.CONTENT_LENGTH, prettyPrinted.getBytes().length).content(prettyPrinted)));
}

View File

@@ -21,14 +21,13 @@ import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;
import javax.servlet.ServletException;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import jakarta.servlet.ServletException;
import jakarta.servlet.http.Cookie;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import org.apache.catalina.Context;
import org.apache.catalina.LifecycleException;
import org.apache.catalina.startup.Tomcat;

View File

@@ -20,18 +20,4 @@ dependencies {
testImplementation("org.mockito:mockito-core")
testRuntimeOnly("org.springframework:spring-context")
testRuntimeOnly("org.synchronoss.cloud:nio-multipart-parser")
}
compatibilityTest {
dependency("Spring Framework") { springFramework ->
springFramework.groupId = "org.springframework"
springFramework.versions = ["5.1.+", "5.2.+", "5.3.+"]
}
}
project.afterEvaluate {
configurations.getByName("testRuntimeClasspath_spring_framework_5.3.+") {
exclude group: "org.synchronoss.cloud", module: "nio-multipart-parser"
}
}

View File

@@ -34,10 +34,10 @@ import org.springframework.http.MediaType;
import org.springframework.http.ReactiveHttpInputMessage;
import org.springframework.http.codec.FormHttpMessageReader;
import org.springframework.http.codec.HttpMessageReader;
import org.springframework.http.codec.multipart.DefaultPartHttpMessageReader;
import org.springframework.http.codec.multipart.FilePart;
import org.springframework.http.codec.multipart.MultipartHttpMessageReader;
import org.springframework.http.codec.multipart.Part;
import org.springframework.http.codec.multipart.SynchronossPartHttpMessageReader;
import org.springframework.restdocs.operation.OperationRequest;
import org.springframework.restdocs.operation.OperationRequestFactory;
import org.springframework.restdocs.operation.OperationRequestPart;
@@ -48,7 +48,6 @@ import org.springframework.restdocs.operation.RequestConverter;
import org.springframework.restdocs.operation.RequestCookie;
import org.springframework.test.web.reactive.server.ExchangeResult;
import org.springframework.test.web.reactive.server.WebTestClient;
import org.springframework.util.ClassUtils;
import org.springframework.util.LinkedMultiValueMap;
import org.springframework.util.MultiValueMap;
@@ -60,8 +59,6 @@ import org.springframework.util.MultiValueMap;
*/
class WebTestClientRequestConverter implements RequestConverter<ExchangeResult> {
private static final String DEFAULT_PART_HTTP_MESSAGE_READER = "org.springframework.http.codec.multipart.DefaultPartHttpMessageReader";
private static final ResolvableType FORM_DATA_TYPE = ResolvableType.forClassWithGenerics(MultiValueMap.class,
String.class, String.class);
@@ -94,10 +91,7 @@ class WebTestClientRequestConverter implements RequestConverter<ExchangeResult>
}
private List<OperationRequestPart> extractRequestParts(ExchangeResult result) {
HttpMessageReader<Part> partHttpMessageReader = findPartHttpMessageReader();
if (partHttpMessageReader == null) {
return Collections.emptyList();
}
HttpMessageReader<Part> partHttpMessageReader = new DefaultPartHttpMessageReader();
return new MultipartHttpMessageReader(partHttpMessageReader)
.readMono(ResolvableType.forClass(Part.class), new ExchangeResultReactiveHttpInputMessage(result),
Collections.emptyMap())
@@ -105,25 +99,6 @@ class WebTestClientRequestConverter implements RequestConverter<ExchangeResult>
.flatMap((parts) -> parts.stream().map(this::createOperationRequestPart)).collect(Collectors.toList());
}
@SuppressWarnings("unchecked")
private HttpMessageReader<Part> findPartHttpMessageReader() {
if (ClassUtils.isPresent(DEFAULT_PART_HTTP_MESSAGE_READER, getClass().getClassLoader())) {
try {
return (HttpMessageReader<Part>) Class
.forName(DEFAULT_PART_HTTP_MESSAGE_READER, true, getClass().getClassLoader())
.getDeclaredConstructor().newInstance();
}
catch (Exception ex) {
// Continue
}
}
if (ClassUtils.isPresent("org.synchronoss.cloud.nio.multipart.NioMultipartParserListener",
getClass().getClassLoader())) {
return new SynchronossPartHttpMessageReader();
}
return null;
}
private OperationRequestPart createOperationRequestPart(Part part) {
ByteArrayOutputStream content = readPartBodyContent(part);
return new OperationRequestPartFactory().create(part.name(),

View File

@@ -94,7 +94,7 @@ public class WebTestClientRestDocumentationConfigurer extends
private ClientRequest applyUriDefaults(ClientRequest request) {
URI requestUri = request.url();
if (!StringUtils.isEmpty(requestUri.getHost())) {
if (StringUtils.hasLength(requestUri.getHost())) {
return request;
}
try {

View File

@@ -46,7 +46,7 @@ public class WebTestClientResponseConverterTests {
public void basicResponse() {
ExchangeResult result = WebTestClient
.bindToRouterFunction(
RouterFunctions.route(GET("/foo"), (req) -> ServerResponse.ok().syncBody("Hello, World!")))
RouterFunctions.route(GET("/foo"), (req) -> ServerResponse.ok().bodyValue("Hello, World!")))
.configureClient().baseUrl("http://localhost").build().get().uri("/foo").exchange().expectBody()
.returnResult();
OperationResponse response = this.converter.convert(result);

View File

@@ -68,7 +68,7 @@ import static org.springframework.restdocs.request.RequestDocumentation.requestP
import static org.springframework.restdocs.request.RequestDocumentation.requestParts;
import static org.springframework.restdocs.webtestclient.WebTestClientRestDocumentation.document;
import static org.springframework.restdocs.webtestclient.WebTestClientRestDocumentation.documentationConfiguration;
import static org.springframework.web.reactive.function.BodyInserters.fromObject;
import static org.springframework.web.reactive.function.BodyInserters.fromValue;
/**
* Integration tests for using Spring REST Docs with Spring Framework's WebTestClient.
@@ -86,9 +86,9 @@ public class WebTestClientRestDocumentationIntegrationTests {
public void setUp() {
RouterFunction<ServerResponse> route = RouterFunctions
.route(RequestPredicates.GET("/"),
(request) -> ServerResponse.status(HttpStatus.OK).body(fromObject(new Person("Jane", "Doe"))))
(request) -> ServerResponse.status(HttpStatus.OK).body(fromValue(new Person("Jane", "Doe"))))
.andRoute(RequestPredicates.GET("/{foo}/{bar}"),
(request) -> ServerResponse.status(HttpStatus.OK).body(fromObject(new Person("Jane", "Doe"))))
(request) -> ServerResponse.status(HttpStatus.OK).body(fromValue(new Person("Jane", "Doe"))))
.andRoute(RequestPredicates.POST("/upload"),
(request) -> request.body(BodyExtractors.toMultipartData())
.map((parts) -> ServerResponse.status(HttpStatus.OK).build().block()))