Raise the minimum supported version of Spring Framework to 5.0

This commit upgrades to Spring Framework 5.0.0.RC1. It also upgrades
the Spring Boot-based samples to use Spring Boot 2.0.0.M1 which
supports Spring Framework 5. Lastly, it upgrades a number of
third-party dependencies to align with Spring Framework 5 and Spring
Boot 2.

Closes gh-386
This commit is contained in:
Andy Wilkinson
2017-05-18 16:22:08 +02:00
parent a8e1df3fd8
commit 41d537d06a
18 changed files with 52 additions and 44 deletions

View File

@@ -20,6 +20,7 @@ allprojects {
group = 'org.springframework.restdocs'
repositories {
mavenCentral()
maven { url 'https://repo.spring.io/milestone' }
}
}
@@ -38,7 +39,7 @@ sonarqube {
}
ext {
springVersion = '4.3.6.RELEASE'
springVersion = '5.0.0.RC1'
javadocLinks = [
'http://docs.oracle.com/javase/8/docs/api/',
"http://docs.spring.io/spring-framework/docs/$springVersion/javadoc-api/",
@@ -64,7 +65,7 @@ subprojects {
mavenBom "org.springframework:spring-framework-bom:$springVersion"
}
dependencies {
dependency 'com.fasterxml.jackson.core:jackson-databind:2.5.5'
dependency 'com.fasterxml.jackson.core:jackson-databind:2.9.0.pr3'
dependency 'com.jayway.restassured:rest-assured:2.8.0'
dependency 'com.samskivert:jmustache:1.12'
dependency 'commons-codec:commons-codec:1.10'
@@ -75,9 +76,9 @@ subprojects {
dependency 'org.asciidoctor:asciidoctorj:1.5.3.1'
dependency 'org.hamcrest:hamcrest-core:1.3'
dependency 'org.hamcrest:hamcrest-library:1.3'
dependency 'org.hibernate:hibernate-validator:5.2.2.Final'
dependency 'org.hibernate:hibernate-validator:5.4.1.Final'
dependency 'org.mockito:mockito-core:1.10.19'
dependency 'org.springframework.hateoas:spring-hateoas:0.19.0.RELEASE'
dependency 'org.springframework.hateoas:spring-hateoas:0.23.0.RELEASE'
dependency 'org.jacoco:org.jacoco.agent:0.7.7.201606060606'
}
}

View File

@@ -68,7 +68,7 @@ If you want to jump straight in, a number of sample applications are available:
Spring REST Docs has the following minimum requirements:
- Java 8
- Spring Framework 4.3
- Spring Framework 5
Additionally, the `spring-restdocs-restassured` module has the following minimum
requirements:

View File

@@ -21,7 +21,7 @@ import org.springframework.test.web.servlet.MockMvc;
import static org.springframework.restdocs.mockmvc.MockMvcRestDocumentation.document;
import static org.springframework.restdocs.request.RequestDocumentation.partWithName;
import static org.springframework.restdocs.request.RequestDocumentation.requestParts;
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.fileUpload;
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.multipart;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
public class RequestParts {
@@ -30,7 +30,7 @@ public class RequestParts {
public void upload() throws Exception {
// tag::request-parts[]
this.mockMvc.perform(fileUpload("/upload").file("file", "example".getBytes())) // <1>
this.mockMvc.perform(multipart("/upload").file("file", "example".getBytes())) // <1>
.andExpect(status().isOk())
.andDo(document("upload", requestParts( // <2>
partWithName("file").description("The file to upload")) // <3>

View File

@@ -1,9 +1,9 @@
buildscript {
repositories {
mavenCentral()
maven { url 'https://repo.spring.io/milestone' }
}
dependencies {
classpath 'org.springframework.boot:spring-boot-gradle-plugin:1.5.3.RELEASE'
classpath 'org.springframework.boot:spring-boot-gradle-plugin:2.0.0.M1'
}
}
@@ -12,8 +12,9 @@ plugins {
}
apply plugin: 'java'
apply plugin: 'spring-boot'
apply plugin: 'org.springframework.boot'
apply plugin: 'eclipse'
apply plugin: 'io.spring.dependency-management'
repositories {
mavenLocal()

View File

@@ -1,5 +1,5 @@
/*
* Copyright 2014-2016 the original author or authors.
* Copyright 2014-2017 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -27,9 +27,9 @@ import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.boot.context.embedded.LocalServerPort;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.boot.test.context.SpringBootTest.WebEnvironment;
import org.springframework.boot.web.server.LocalServerPort;
import org.springframework.restdocs.JUnitRestDocumentation;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

View File

@@ -1,15 +1,16 @@
buildscript {
repositories {
mavenCentral()
maven { url 'https://repo.spring.io/milestone' }
}
dependencies {
classpath 'org.springframework.boot:spring-boot-gradle-plugin:1.5.3.RELEASE'
classpath 'org.springframework.boot:spring-boot-gradle-plugin:2.0.0.M1'
}
}
apply plugin: 'java'
apply plugin: 'spring-boot'
apply plugin: 'org.springframework.boot'
apply plugin: 'eclipse'
apply plugin: 'io.spring.dependency-management'
repositories {
mavenLocal()

View File

@@ -1,15 +1,15 @@
eclipse.preferences.version=1
org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.7
org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8
org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
org.eclipse.jdt.core.compiler.compliance=1.7
org.eclipse.jdt.core.compiler.compliance=1.8
org.eclipse.jdt.core.compiler.debug.lineNumber=generate
org.eclipse.jdt.core.compiler.debug.localVariable=generate
org.eclipse.jdt.core.compiler.debug.sourceFile=generate
org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
org.eclipse.jdt.core.compiler.problem.forbiddenReference=warning
org.eclipse.jdt.core.compiler.source=1.7
org.eclipse.jdt.core.compiler.source=1.8
org.eclipse.jdt.core.formatter.align_type_members_on_columns=false
org.eclipse.jdt.core.formatter.alignment_for_arguments_in_allocation_expression=16
org.eclipse.jdt.core.formatter.alignment_for_arguments_in_annotation=0

View File

@@ -11,7 +11,7 @@
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.3.RELEASE</version>
<version>2.0.0.M1</version>
<relativePath />
</parent>

View File

@@ -1,9 +1,9 @@
buildscript {
repositories {
mavenCentral()
maven { url 'https://repo.spring.io/milestone' }
}
dependencies {
classpath 'org.springframework.boot:spring-boot-gradle-plugin:1.5.3.RELEASE'
classpath 'org.springframework.boot:spring-boot-gradle-plugin:2.0.0.M1'
}
}
@@ -12,8 +12,9 @@ plugins {
}
apply plugin: 'java'
apply plugin: 'spring-boot'
apply plugin: 'org.springframework.boot'
apply plugin: 'eclipse'
apply plugin: 'io.spring.dependency-management'
repositories {
mavenLocal()

View File

@@ -1,5 +1,5 @@
/*
* Copyright 2014 the original author or authors.
* Copyright 2014-2017 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -18,7 +18,7 @@ package com.example.notes;
import java.util.Map;
import org.springframework.boot.autoconfigure.web.DefaultErrorAttributes;
import org.springframework.boot.autoconfigure.web.servlet.error.DefaultErrorAttributes;
import org.springframework.stereotype.Component;
import org.springframework.web.context.request.RequestAttributes;

View File

@@ -1,5 +1,5 @@
/*
* Copyright 2014-2015 the original author or authors.
* Copyright 2014-2017 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -87,7 +87,7 @@ public class NotesController {
@RequestMapping(value = "/{id}", method = RequestMethod.DELETE)
void delete(@PathVariable("id") long id) {
this.noteRepository.delete(id);
this.noteRepository.deleteById(id);
}
@RequestMapping(value = "/{id}", method = RequestMethod.GET)

View File

@@ -1,5 +1,5 @@
/*
* Copyright 2014-2015 the original author or authors.
* Copyright 2014-2017 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -74,7 +74,7 @@ public class TagsController {
@RequestMapping(value = "/{id}", method = RequestMethod.DELETE)
void delete(@PathVariable("id") long id) {
this.repository.delete(id);
this.repository.deleteById(id);
}
@RequestMapping(value = "/{id}", method = RequestMethod.GET)

View File

@@ -1,9 +1,9 @@
buildscript {
repositories {
mavenCentral()
maven { url 'https://repo.spring.io/milestone' }
}
dependencies {
classpath 'org.springframework.boot:spring-boot-gradle-plugin:1.5.3.RELEASE'
classpath 'org.springframework.boot:spring-boot-gradle-plugin:2.0.0.M1'
}
}
@@ -12,8 +12,9 @@ plugins {
}
apply plugin: 'java'
apply plugin: 'spring-boot'
apply plugin: 'org.springframework.boot'
apply plugin: 'eclipse'
apply plugin: 'io.spring.dependency-management'
repositories {
mavenLocal()

View File

@@ -1,5 +1,5 @@
/*
* Copyright 2014-2016 the original author or authors.
* Copyright 2014-2017 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -53,8 +53,10 @@ public abstract class AbstractHeadersSnippet extends TemplatedSnippet {
Map<String, Object> attributes) {
super(type + "-headers", attributes);
for (HeaderDescriptor descriptor : descriptors) {
Assert.notNull(descriptor.getName());
Assert.notNull(descriptor.getDescription());
Assert.notNull(descriptor.getName(),
"The name of the header must not be null");
Assert.notNull(descriptor.getDescription(),
"The description of the header must not be null");
}
this.headerDescriptors = descriptors;
this.type = type;

View File

@@ -1,5 +1,5 @@
/*
* Copyright 2014-2015 the original author or authors.
* Copyright 2014-2017 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -270,7 +270,8 @@ public class ResourceBundleConstraintDescriptionResolverTests {
private Constraint getConstraintFromField(String name) {
Annotation[] annotations = ReflectionUtils.findField(Constrained.class, name)
.getAnnotations();
Assert.isTrue(annotations.length == 1);
Assert.isTrue(annotations.length == 1, "The field '" + name + "' must have"
+ "exactly one @Constrained annotation");
return new Constraint(annotations[0].annotationType().getName(),
AnnotationUtils.getAnnotationAttributes(annotations[0]));
}

View File

@@ -1,5 +1,5 @@
/*
* Copyright 2014-2015 the original author or authors.
* Copyright 2014-2017 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -249,7 +249,7 @@ public abstract class RestDocumentationRequestBuilders {
public static MockMultipartHttpServletRequestBuilder fileUpload(String urlTemplate,
Object... urlVariables) {
return (MockMultipartHttpServletRequestBuilder) MockMvcRequestBuilders
.fileUpload(urlTemplate, urlVariables)
.multipart(urlTemplate, urlVariables)
.requestAttr(RestDocumentationGenerator.ATTRIBUTE_NAME_URL_TEMPLATE,
urlTemplate);
}
@@ -261,7 +261,7 @@ public abstract class RestDocumentationRequestBuilders {
* @return the builder for the file upload request
*/
public static MockMultipartHttpServletRequestBuilder fileUpload(URI uri) {
return MockMvcRequestBuilders.fileUpload(uri);
return MockMvcRequestBuilders.multipart(uri);
}
}

View File

@@ -174,7 +174,7 @@ public class MockMvcRequestConverterTests {
@Test
public void mockMultipartFileUpload() throws Exception {
OperationRequest request = createOperationRequest(
MockMvcRequestBuilders.fileUpload("/foo")
MockMvcRequestBuilders.multipart("/foo")
.file(new MockMultipartFile("file", new byte[] { 1, 2, 3, 4 })));
assertThat(request.getUri(), is(URI.create("http://localhost/foo")));
assertThat(request.getMethod(), is(HttpMethod.POST));
@@ -190,7 +190,7 @@ public class MockMvcRequestConverterTests {
@Test
public void mockMultipartFileUploadWithContentType() throws Exception {
OperationRequest request = createOperationRequest(
MockMvcRequestBuilders.fileUpload("/foo").file(new MockMultipartFile(
MockMvcRequestBuilders.multipart("/foo").file(new MockMultipartFile(
"file", "original", "image/png", new byte[] { 1, 2, 3, 4 })));
assertThat(request.getUri(), is(URI.create("http://localhost/foo")));
assertThat(request.getMethod(), is(HttpMethod.POST));

View File

@@ -93,7 +93,7 @@ import static org.springframework.restdocs.test.SnippetMatchers.codeBlock;
import static org.springframework.restdocs.test.SnippetMatchers.httpRequest;
import static org.springframework.restdocs.test.SnippetMatchers.httpResponse;
import static org.springframework.restdocs.test.SnippetMatchers.snippet;
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.fileUpload;
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.multipart;
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
@@ -348,7 +348,7 @@ public class MockMvcRestDocumentationIntegrationTests {
MockMvc mockMvc = MockMvcBuilders.webAppContextSetup(this.context)
.apply(documentationConfiguration(this.restDocumentation)).build();
mockMvc.perform(fileUpload("/upload").file("foo", "bar".getBytes()))
mockMvc.perform(multipart("/upload").file("foo", "bar".getBytes()))
.andExpect(status().isOk()).andDo(document("request-parts", requestParts(
partWithName("foo").description("The description"))));
@@ -577,7 +577,7 @@ public class MockMvcRestDocumentationIntegrationTests {
public void multiPart() throws Exception {
MockMvc mockMvc = MockMvcBuilders.webAppContextSetup(this.context)
.apply(documentationConfiguration(this.restDocumentation)).build();
mockMvc.perform(fileUpload("/upload").file("test", "content".getBytes()))
mockMvc.perform(multipart("/upload").file("test", "content".getBytes()))
.andExpect(status().isOk()).andDo(document("upload",
requestParts(partWithName("test").description("Foo"))));
}