Commit 56e31a8c authored by Phillip Webb's avatar Phillip Webb

Polish

parent 1f0d45d7
/*
* 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.
......
/*
* 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 null;
}
return module;
}
}
@Configuration
......
/*
* 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.
......
/*
* 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.
......
/*
* 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.
......
/*
* 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);
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 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
......
......@@ -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.
......
/*
* 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.
......
/*
* 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.
......
/*
* 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.
......
/*
* 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.
......
/*
* 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.
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment