Upgrade to Spring Framework 6 and Jakarta EE 9
Closes gh-750 Closes gh-748
This commit is contained in:
@@ -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[]
|
||||
|
||||
@@ -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")
|
||||
|
||||
@@ -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:
|
||||
|
||||
|
||||
@@ -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).
|
||||
|
||||
|
||||
@@ -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;
|
||||
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
|
||||
@@ -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.+"]
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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>
|
||||
*
|
||||
|
||||
@@ -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
|
||||
*
|
||||
|
||||
@@ -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
|
||||
@@ -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;
|
||||
|
||||
|
||||
@@ -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";
|
||||
|
||||
@@ -1 +1 @@
|
||||
javax.validation.constraints.NotNull.description=Should not be null
|
||||
jakarta.validation.constraints.NotNull.description=Should not be null
|
||||
@@ -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.+"]
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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"))
|
||||
}
|
||||
|
||||
@@ -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")
|
||||
|
||||
@@ -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)));
|
||||
}
|
||||
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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(),
|
||||
|
||||
@@ -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 {
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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()))
|
||||
|
||||
Reference in New Issue
Block a user