pull/2479/merge
Phillip Webb 10 years ago
parent 1f0d45d795
commit 56e31a8c6b

@ -1,5 +1,5 @@
/*
* Copyright 2012-2014 the original author or authors.
* Copyright 2012-2015 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.

@ -1,5 +1,5 @@
/*
* Copyright 2012-2014 the original author or authors.
* Copyright 2012-2015 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.

@ -16,8 +16,6 @@
package org.springframework.boot.autoconfigure.data.rest;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
@ -26,10 +24,11 @@ import org.springframework.data.rest.core.config.RepositoryRestConfiguration;
import org.springframework.data.rest.webmvc.config.RepositoryRestMvcConfiguration;
import org.springframework.http.converter.json.Jackson2ObjectMapperBuilder;
import com.fasterxml.jackson.databind.ObjectMapper;
/**
* A specialized {@link RepositoryRestMvcConfiguration} that applies configuration
* items from the {@code spring.data.rest} namespace. Also configure Jackson if it's
* available
* A specialized {@link RepositoryRestMvcConfiguration} that applies configuration items
* from the {@code spring.data.rest} namespace. Also configures Jackson if it's available
* <p>
* Favor an extension of this class instead of extending directly from
* {@link RepositoryRestMvcConfiguration}.
@ -38,8 +37,7 @@ import org.springframework.http.converter.json.Jackson2ObjectMapperBuilder;
* @since 1.2.2
*/
@Configuration
public class RepositoryRestMvcBootConfiguration extends
RepositoryRestMvcConfiguration {
public class RepositoryRestMvcBootConfiguration extends RepositoryRestMvcConfiguration {
@Autowired(required = false)
private Jackson2ObjectMapperBuilder objectMapperBuilder;

@ -117,16 +117,22 @@ public class JacksonAutoConfiguration {
@Bean
public Module jodaDateTimeSerializationModule() {
SimpleModule module = new SimpleModule();
JacksonJodaFormat jacksonJodaFormat = getJacksonJodaFormat();
if (jacksonJodaFormat != null) {
module.addSerializer(DateTime.class, new DateTimeSerializer(
jacksonJodaFormat));
}
return module;
}
JacksonJodaFormat jacksonJodaFormat = null;
private JacksonJodaFormat getJacksonJodaFormat() {
if (this.jacksonProperties.getJodaDateTimeFormat() != null) {
jacksonJodaFormat = new JacksonJodaFormat(DateTimeFormat.forPattern(
return new JacksonJodaFormat(DateTimeFormat.forPattern(
this.jacksonProperties.getJodaDateTimeFormat()).withZoneUTC());
}
else if (this.jacksonProperties.getDateFormat() != null) {
if (this.jacksonProperties.getDateFormat() != null) {
try {
jacksonJodaFormat = new JacksonJodaFormat(DateTimeFormat.forPattern(
return new JacksonJodaFormat(DateTimeFormat.forPattern(
this.jacksonProperties.getDateFormat()).withZoneUTC());
}
catch (IllegalArgumentException ex) {
@ -138,14 +144,9 @@ public class JacksonAutoConfiguration {
}
}
}
if (jacksonJodaFormat != null) {
module.addSerializer(DateTime.class, new DateTimeSerializer(
jacksonJodaFormat));
}
return module;
return null;
}
}
@Configuration

@ -1,5 +1,5 @@
/*
* Copyright 2012-2014 the original author or authors.
* Copyright 2012-2015 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.

@ -1,5 +1,5 @@
/*
* Copyright 2012-2014 the original author or authors.
* Copyright 2012-2015 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.

@ -1,5 +1,5 @@
/*
* Copyright 2002-2014 the original author or authors.
* Copyright 2002-2015 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.

@ -1,5 +1,5 @@
/*
* Copyright 2012-2014 the original author or authors.
* Copyright 2012-2015 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.

@ -51,15 +51,15 @@ class InitializrService {
/**
* Accept header to use to retrieve the json meta-data.
*/
public static final String ACCEPT_META_DATA =
"application/vnd.initializr.v2.1+json,application/vnd.initializr.v2+json";
public static final String ACCEPT_META_DATA = "application/vnd.initializr.v2.1+"
+ "json,application/vnd.initializr.v2+json";
/**
* Accept header to use to retrieve the service capabilities of the service. If the
* service does not offer such feature, the json meta-data are retrieved instead.
*/
public static final String ACCEPT_SERVICE_CAPABILITIES =
"text/plain," + ACCEPT_META_DATA;
public static final String ACCEPT_SERVICE_CAPABILITIES = "text/plain,"
+ ACCEPT_META_DATA;
/**
* Late binding HTTP client.
@ -110,27 +110,29 @@ class InitializrService {
}
/**
* Loads the service capabilities of the service at the specified url.
* <p>If the service supports generating a textual representation of the
* capabilities, it is returned. Otherwhise the json meta-data as a
* {@link JSONObject} is returned.
* Loads the service capabilities of the service at the specified URL. If the service
* supports generating a textual representation of the capabilities, it is returned,
* otherwise {@link InitializrServiceMetadata} is returned.
* @param serviceUrl to url of the initializer service
* @return the service capabilities (as a String) or the metadata describing the service
* @return the service capabilities (as a String) or the
* {@link InitializrServiceMetadata} describing the service
* @throws IOException if the service capabilities cannot be loaded
*/
public Object loadServiceCapabilities(String serviceUrl) throws IOException {
CloseableHttpResponse httpResponse = executeServiceCapabilitiesRetrieval(serviceUrl);
public Object loadServiceCapabilities(String serviceUrl) throws IOException {
HttpGet request = new HttpGet(serviceUrl);
request.setHeader(new BasicHeader(HttpHeaders.ACCEPT, ACCEPT_SERVICE_CAPABILITIES));
CloseableHttpResponse httpResponse = execute(request, serviceUrl, "retrieve help");
validateResponse(httpResponse, serviceUrl);
HttpEntity httpEntity = httpResponse.getEntity();
ContentType contentType = ContentType.getOrDefault(httpEntity);
if (contentType.getMimeType().equals("text/plain")) {
return getContent(httpEntity);
} else {
return parseJsonMetadata(httpEntity);
return getContent(httpEntity);
}
return parseJsonMetadata(httpEntity);
}
private InitializrServiceMetadata parseJsonMetadata(HttpEntity httpEntity) throws IOException {
private InitializrServiceMetadata parseJsonMetadata(HttpEntity httpEntity)
throws IOException {
try {
return new InitializrServiceMetadata(getContentAsJson(httpEntity));
}
@ -179,15 +181,6 @@ class InitializrService {
return execute(request, url, "retrieve metadata");
}
/**
* Retrieves the service capabilities of the service at the specified URL
*/
private CloseableHttpResponse executeServiceCapabilitiesRetrieval(String url) {
HttpGet request = new HttpGet(url);
request.setHeader(new BasicHeader(HttpHeaders.ACCEPT, ACCEPT_SERVICE_CAPABILITIES));
return execute(request, url, "retrieve help");
}
private CloseableHttpResponse execute(HttpUriRequest request, Object url,
String description) {
try {

@ -48,7 +48,7 @@ class ServiceCapabilitiesReportGenerator {
/**
* Generate a report for the specified service. The report contains the available
* capabilities as advertized by the root endpoint.
* capabilities as advertised by the root endpoint.
* @param url the url of the service
* @return the report that describes the service
* @throws IOException if the report cannot be generated
@ -57,9 +57,8 @@ class ServiceCapabilitiesReportGenerator {
Object content = this.initializrService.loadServiceCapabilities(url);
if (content instanceof InitializrServiceMetadata) {
return generateHelp(url, (InitializrServiceMetadata) content);
} else {
return content.toString();
}
return content.toString();
}
private String generateHelp(String url, InitializrServiceMetadata metadata) {

@ -49,15 +49,18 @@ public abstract class AbstractHttpClientMockTests {
protected final CloseableHttpClient http = mock(CloseableHttpClient.class);
protected void mockSuccessfulMetadataTextGet() throws IOException {
mockSuccessfulMetadataGet("metadata/service-metadata-2.1.0.txt", "text/plain", true);
mockSuccessfulMetadataGet("metadata/service-metadata-2.1.0.txt", "text/plain",
true);
}
protected void mockSuccessfulMetadataGet(boolean serviceCapabilities) throws IOException {
protected void mockSuccessfulMetadataGet(boolean serviceCapabilities)
throws IOException {
mockSuccessfulMetadataGet("metadata/service-metadata-2.1.0.json",
"application/vnd.initializr.v2.1+json", serviceCapabilities);
}
protected void mockSuccessfulMetadataGetV2(boolean serviceCapabilities) throws IOException {
protected void mockSuccessfulMetadataGetV2(boolean serviceCapabilities)
throws IOException {
mockSuccessfulMetadataGet("metadata/service-metadata-2.0.0.json",
"application/vnd.initializr.v2+json", serviceCapabilities);
}
@ -68,7 +71,8 @@ public abstract class AbstractHttpClientMockTests {
byte[] content = readClasspathResource(contentPath);
mockHttpEntity(response, content, contentType);
mockStatus(response, 200);
given(this.http.execute(argThat(getForMetadata(serviceCapabilities)))).willReturn(response);
given(this.http.execute(argThat(getForMetadata(serviceCapabilities))))
.willReturn(response);
}
protected byte[] readClasspathResource(String contentPath) throws IOException {
@ -137,12 +141,10 @@ public abstract class AbstractHttpClientMockTests {
}
private Matcher<HttpGet> getForMetadata(boolean serviceCapabilities) {
if (serviceCapabilities) {
return new HasAcceptHeader(InitializrService.ACCEPT_SERVICE_CAPABILITIES, true);
}
else {
if (!serviceCapabilities) {
return new HasAcceptHeader(InitializrService.ACCEPT_META_DATA, true);
}
return new HasAcceptHeader(InitializrService.ACCEPT_SERVICE_CAPABILITIES, true);
}
private Matcher<HttpGet> getForNonMetadata() {
@ -206,6 +208,7 @@ public abstract class AbstractHttpClientMockTests {
}
return acceptHeader == null || !this.value.equals(acceptHeader.getValue());
}
}
}

@ -37,7 +37,8 @@ public class ServiceCapabilitiesReportGeneratorTests extends AbstractHttpClientM
@Test
public void listMetadataFromServer() throws IOException {
mockSuccessfulMetadataTextGet();
String expected = new String(readClasspathResource("metadata/service-metadata-2.1.0.txt"));
String expected = new String(
readClasspathResource("metadata/service-metadata-2.1.0.txt"));
String content = this.command.generate("http://localhost");
assertThat(content, equalTo(expected));
}

@ -1483,6 +1483,7 @@ repository types (Elasticsearch, Solr). Just change the names of the annotations
respectively.
[[howto-use-exposing-spring-data-repositories-rest-endpoint]]
=== Expose Spring Data repositories as REST endpoint
@ -1497,6 +1498,7 @@ extending from `RepositoryRestMvcBootConfiguration` instead as the latter provid
the handling of `spring.data.rest` properties.
[[howto-database-initialization]]
== Database initialization
An SQL database can be initialized in different ways depending on what your stack is. Or

@ -297,14 +297,13 @@ Maven '`project properties`' via `@..@` placeholders, e.g.
NOTE: In the above example we used `+project.*+` to set some values to be used as
fallbacks if the Maven resource filtering has not been switched on for some reason.
TIP: The `spring-boot:run` maven goal adds `src/main/resources` directly to
the classpath (for hot reloading purposes). This circumvents the resource
filtering and this feature. You can use the `exec:java` goal instead or
customize the plugin's configuration, see the
TIP: The `spring-boot:run` maven goal adds `src/main/resources` directly to the classpath
(for hot reloading purposes). This circumvents the resource filtering and this feature.
You can use the `exec:java` goal instead or customize the plugin's configuration, see the
{spring-boot-maven-plugin-site}/usage.html[plugin usage page] for more details.
NOTE: If you don't use the starter parent, in your `pom.xml` you need (inside the `<build/>` element):
If you don't use the starter parent, in your `pom.xml` you need (inside the `<build/>`
element):
[source,xml,indent=0]
----
@ -332,6 +331,8 @@ and (inside `<plugins/>`):
</plugin>
----
[[production-ready-application-info-automatic-expansion-gradle]]
===== Automatic property expansion using Gradle
You can automatically expand info properties from the Gradle project by configuring

@ -1271,7 +1271,7 @@ instance. By default the embedded server will listen for HTTP requests on port `
[[boot-features-embedded-container-servlets-and-filters]]
==== Servlets and Filters
When using an embedded servlet container you can register Servlets, Filters and all the
When using an embedded servlet container you can register Servlets, Filters and all the
listeners from the Servlet spec (e.g. `HttpSessionListener`) directly as
Spring beans. This can be particularly convenient if you want to refer to a value from
your `application.properties` during configuration.
@ -1281,10 +1281,9 @@ the case of multiple Servlet beans the bean name will be used as a path prefix.
will map to `+/*+`.
If convention-based mapping is not flexible enough you can use the
`ServletRegistrationBean`, `FilterRegistrationBean` and
`ServletListenerRegistrationBean` classes for complete control. You
can also register items directly if your bean implements the
`ServletContextInitializer` interface.
`ServletRegistrationBean`, `FilterRegistrationBean` and `ServletListenerRegistrationBean`
classes for complete control. You can also register items directly if your bean implements
the `ServletContextInitializer` interface.

@ -1,5 +1,5 @@
/*
* Copyright 2012-2014 the original author or authors.
* Copyright 2012-2015 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.

@ -1,5 +1,5 @@
/*
* Copyright 2012-2014 the original author or authors.
* Copyright 2012-2015 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.

@ -1,5 +1,5 @@
/*
* Copyright 2012-2014 the original author or authors.
* Copyright 2012-2015 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.

@ -1,5 +1,5 @@
/*
* Copyright 2012-2013 the original author or authors.
* Copyright 2012-2015 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.

@ -1,5 +1,5 @@
/*
* Copyright 2012-2014 the original author or authors.
* Copyright 2012-2015 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.

Loading…
Cancel
Save