Merge branch '1.1.x'
This commit is contained in:
commit
0d0e5eb590
|
|
@ -16,6 +16,7 @@
|
|||
|
||||
package org.springframework.boot.actuate.autoconfigure;
|
||||
|
||||
import java.util.Collections;
|
||||
import java.util.HashSet;
|
||||
import java.util.Set;
|
||||
|
||||
|
|
@ -36,6 +37,7 @@ import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
|
|||
import org.springframework.boot.autoconfigure.condition.SearchStrategy;
|
||||
import org.springframework.boot.autoconfigure.web.ErrorAttributes;
|
||||
import org.springframework.boot.autoconfigure.web.HttpMessageConverters;
|
||||
import org.springframework.boot.autoconfigure.web.ServerProperties;
|
||||
import org.springframework.boot.context.embedded.ConfigurableEmbeddedServletContainer;
|
||||
import org.springframework.boot.context.embedded.EmbeddedServletContainer;
|
||||
import org.springframework.boot.context.embedded.EmbeddedServletContainerCustomizer;
|
||||
|
|
@ -75,13 +77,23 @@ public class EndpointWebMvcChildContextConfiguration {
|
|||
// instances get their callback very early in the context lifecycle.
|
||||
private ManagementServerProperties managementServerProperties;
|
||||
|
||||
private ServerProperties server;
|
||||
|
||||
@Override
|
||||
public void customize(ConfigurableEmbeddedServletContainer container) {
|
||||
if (this.managementServerProperties == null) {
|
||||
this.managementServerProperties = BeanFactoryUtils
|
||||
.beanOfTypeIncludingAncestors(this.beanFactory,
|
||||
ManagementServerProperties.class);
|
||||
this.server = BeanFactoryUtils
|
||||
.beanOfTypeIncludingAncestors(this.beanFactory,
|
||||
ServerProperties.class);
|
||||
}
|
||||
// Customize as per the parent context first (so e.g. the access logs go to the same place)
|
||||
server.customize(container);
|
||||
// Then reset the error pages
|
||||
container.setErrorPages(Collections.<ErrorPage>emptySet());
|
||||
// and add the management-specific bits
|
||||
container.setPort(this.managementServerProperties.getPort());
|
||||
container.setAddress(this.managementServerProperties.getAddress());
|
||||
container.setContextPath(this.managementServerProperties.getContextPath());
|
||||
|
|
|
|||
|
|
@ -35,6 +35,7 @@ import org.springframework.boot.autoconfigure.web.ServerProperties;
|
|||
import org.springframework.boot.autoconfigure.web.ServerPropertiesAutoConfiguration;
|
||||
import org.springframework.boot.autoconfigure.web.WebMvcAutoConfiguration;
|
||||
import org.springframework.boot.context.embedded.AnnotationConfigEmbeddedWebApplicationContext;
|
||||
import org.springframework.boot.context.embedded.ConfigurableEmbeddedServletContainer;
|
||||
import org.springframework.boot.context.embedded.EmbeddedServletContainer;
|
||||
import org.springframework.boot.context.embedded.EmbeddedServletContainerInitializedEvent;
|
||||
import org.springframework.boot.test.EnvironmentTestUtils;
|
||||
|
|
@ -222,6 +223,7 @@ public class EndpointWebMvcAutoConfigurationTests {
|
|||
assertThat(localServerPort, notNullValue());
|
||||
assertThat(localManagementPort, notNullValue());
|
||||
assertThat(localServerPort, not(equalTo(localManagementPort)));
|
||||
assertThat(applicationContext.getBean(ServerPortConfig.class).getCount(), equalTo(2));
|
||||
this.applicationContext.close();
|
||||
assertAllClosed();
|
||||
}
|
||||
|
|
@ -303,10 +305,22 @@ public class EndpointWebMvcAutoConfigurationTests {
|
|||
|
||||
@Configuration
|
||||
public static class ServerPortConfig {
|
||||
|
||||
private int count = 0;
|
||||
|
||||
public int getCount() {
|
||||
return count;
|
||||
}
|
||||
|
||||
@Bean
|
||||
public ServerProperties serverProperties() {
|
||||
ServerProperties properties = new ServerProperties();
|
||||
ServerProperties properties = new ServerProperties() {
|
||||
@Override
|
||||
public void customize(ConfigurableEmbeddedServletContainer container) {
|
||||
count++;
|
||||
super.customize(container);
|
||||
}
|
||||
};
|
||||
properties.setPort(ports.get().server);
|
||||
return properties;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -29,6 +29,7 @@ import org.springframework.boot.autoconfigure.AutoConfigureAfter;
|
|||
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
|
||||
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
|
||||
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
|
||||
import org.springframework.boot.autoconfigure.condition.ConditionalOnWebApplication;
|
||||
import org.springframework.boot.autoconfigure.web.WebMvcAutoConfiguration;
|
||||
import org.springframework.boot.context.properties.EnableConfigurationProperties;
|
||||
import org.springframework.context.annotation.Bean;
|
||||
|
|
@ -163,6 +164,7 @@ public class ThymeleafAutoConfiguration {
|
|||
|
||||
@Configuration
|
||||
@ConditionalOnClass({ Servlet.class })
|
||||
@ConditionalOnWebApplication
|
||||
protected static class ThymeleafViewResolverConfiguration {
|
||||
|
||||
@Autowired
|
||||
|
|
|
|||
|
|
@ -0,0 +1,52 @@
|
|||
/*
|
||||
* Copyright 2012-2014 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.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package org.springframework.boot.autoconfigure.mongo;
|
||||
|
||||
import org.junit.Test;
|
||||
import org.springframework.boot.context.properties.EnableConfigurationProperties;
|
||||
import org.springframework.boot.test.EnvironmentTestUtils;
|
||||
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
|
||||
import org.springframework.context.annotation.Configuration;
|
||||
|
||||
import static org.hamcrest.Matchers.equalTo;
|
||||
import static org.junit.Assert.assertThat;
|
||||
|
||||
/**
|
||||
* Tests for {@link MongoProperties}.
|
||||
*
|
||||
* @author Phillip Webb
|
||||
*/
|
||||
public class MongoPropertiesTests {
|
||||
|
||||
@Test
|
||||
public void canBindCharArrayPassword() {
|
||||
// gh-1572
|
||||
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext();
|
||||
EnvironmentTestUtils.addEnvironment(context, "spring.data.mongodb.password:word");
|
||||
context.register(Conf.class);
|
||||
context.refresh();
|
||||
MongoProperties properties = context.getBean(MongoProperties.class);
|
||||
assertThat(properties.getPassword(), equalTo("word".toCharArray()));
|
||||
}
|
||||
|
||||
@Configuration
|
||||
@EnableConfigurationProperties(MongoProperties.class)
|
||||
static class Conf {
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
|
@ -30,6 +30,7 @@ import org.springframework.mock.web.MockHttpServletRequest;
|
|||
import org.springframework.mock.web.MockHttpServletResponse;
|
||||
import org.springframework.mock.web.MockServletContext;
|
||||
import org.springframework.web.context.support.AnnotationConfigWebApplicationContext;
|
||||
import org.springframework.web.servlet.ViewResolver;
|
||||
import org.springframework.web.servlet.support.RequestContext;
|
||||
import org.thymeleaf.TemplateEngine;
|
||||
import org.thymeleaf.context.Context;
|
||||
|
|
@ -38,8 +39,10 @@ import org.thymeleaf.spring4.view.ThymeleafViewResolver;
|
|||
import org.thymeleaf.templateresolver.ITemplateResolver;
|
||||
import org.thymeleaf.templateresolver.TemplateResolver;
|
||||
|
||||
import static org.hamcrest.Matchers.containsString;
|
||||
import static org.junit.Assert.assertArrayEquals;
|
||||
import static org.junit.Assert.assertEquals;
|
||||
import static org.junit.Assert.assertThat;
|
||||
import static org.junit.Assert.assertTrue;
|
||||
|
||||
/**
|
||||
|
|
@ -49,7 +52,7 @@ import static org.junit.Assert.assertTrue;
|
|||
*/
|
||||
public class ThymeleafAutoConfigurationTests {
|
||||
|
||||
private AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext();
|
||||
private AnnotationConfigWebApplicationContext context = new AnnotationConfigWebApplicationContext();
|
||||
|
||||
@After
|
||||
public void close() {
|
||||
|
|
@ -148,4 +151,33 @@ public class ThymeleafAutoConfigurationTests {
|
|||
assertEquals("<html><body data-foo=\"bar\"></body></html>", result);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void renderTemplate() throws Exception {
|
||||
this.context.register(ThymeleafAutoConfiguration.class,
|
||||
PropertyPlaceholderAutoConfiguration.class);
|
||||
this.context.refresh();
|
||||
TemplateEngine engine = this.context.getBean(TemplateEngine.class);
|
||||
Context attrs = new Context(Locale.UK, Collections.singletonMap("foo", "bar"));
|
||||
String result = engine.process("home", attrs);
|
||||
assertEquals("<html><body>bar</body></html>", result);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void renderNonWebAppTemplate() throws Exception {
|
||||
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(
|
||||
ThymeleafAutoConfiguration.class,
|
||||
PropertyPlaceholderAutoConfiguration.class);
|
||||
assertEquals(0, context.getBeanNamesForType(ViewResolver.class).length);
|
||||
try {
|
||||
TemplateEngine engine = context.getBean(TemplateEngine.class);
|
||||
Context attrs = new Context(Locale.UK, Collections.singletonMap("greeting",
|
||||
"Hello World"));
|
||||
String result = engine.process("message", attrs);
|
||||
assertThat(result, containsString("Hello World"));
|
||||
}
|
||||
finally {
|
||||
context.close();
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
|||
|
|
@ -81,7 +81,8 @@ public class BasicErrorControllerIntegrationTest {
|
|||
"http://localhost:" + this.port + "/bind", Map.class);
|
||||
String resp = entity.getBody().toString();
|
||||
assertThat(resp, containsString("Error count: 1"));
|
||||
assertThat(resp, containsString("errors=[{codes="));
|
||||
assertThat(resp, containsString("errors=[{"));
|
||||
assertThat(resp, containsString("codes=["));
|
||||
assertThat(resp, containsString("org.springframework.validation.BindException"));
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -0,0 +1 @@
|
|||
<html><body th:text="${foo}">Home</body></html>
|
||||
|
|
@ -0,0 +1 @@
|
|||
<html><body>Message: <span th:text="${greeting}">Hello</span></body></html>
|
||||
|
|
@ -10,9 +10,9 @@
|
|||
-- Simple REST service with production features
|
||||
* link:spring-boot-sample-actuator-ui[spring-boot-sample-actuator-ui]
|
||||
-- A web UI example with production features
|
||||
* link:spring-boot-sample-actuator-ui[spring-boot-sample-actuator-noweb]
|
||||
* link:spring-boot-sample-actuator-noweb[spring-boot-sample-actuator-noweb]
|
||||
-- A production features sample with no web application
|
||||
* link:spring-boot-sample-actuator-ui[spring-boot-sample-actuator-log4j]
|
||||
* link:spring-boot-sample-actuator-log4j[spring-boot-sample-actuator-log4j]
|
||||
-- A production features sample using log4j for logging (instead of logback)
|
||||
* link:spring-boot-sample-web-ui[spring-boot-sample-web-ui]
|
||||
-- A thymeleaf web application
|
||||
|
|
@ -48,7 +48,7 @@
|
|||
-- Example showing database migrations with Liquibase
|
||||
* link:spring-boot-sample-amqp[spring-boot-sample-amqp]
|
||||
-- Example showing message-oriented application using RabbitMQ
|
||||
* link:spring-boot-sample-amqp[spring-boot-sample-hornetq]
|
||||
* link:spring-boot-sample-hornetq[spring-boot-sample-hornetq]
|
||||
-- Example showing message-oriented application using HornetQ
|
||||
* link:spring-boot-sample-batch[spring-boot-sample-batch]
|
||||
-- Define and run a Batch job in a few lines of code
|
||||
|
|
|
|||
|
|
@ -1,6 +1,7 @@
|
|||
logging.file: /tmp/logs/app.log
|
||||
logging.level.org.springframework.security: INFO
|
||||
management.address: 127.0.0.1
|
||||
#management.port: 8181
|
||||
endpoints.shutdown.enabled: true
|
||||
server.tomcat.basedir: target/tomcat
|
||||
server.tomcat.access_log_enabled: true
|
||||
|
|
|
|||
|
|
@ -49,6 +49,7 @@ class RelaxedConversionService implements ConversionService {
|
|||
this.additionalConverters = new GenericConversionService();
|
||||
this.additionalConverters
|
||||
.addConverterFactory(new StringToEnumIgnoringCaseConverterFactory());
|
||||
this.additionalConverters.addConverter(new StringToCharArrayConverter());
|
||||
}
|
||||
|
||||
@Override
|
||||
|
|
|
|||
|
|
@ -0,0 +1,33 @@
|
|||
/*
|
||||
* Copyright 2012-2014 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.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package org.springframework.boot.bind;
|
||||
|
||||
import org.springframework.core.convert.converter.Converter;
|
||||
|
||||
/**
|
||||
* Converts a String to a Char Array.
|
||||
*
|
||||
* @author Phillip Webb
|
||||
*/
|
||||
class StringToCharArrayConverter implements Converter<String, char[]> {
|
||||
|
||||
@Override
|
||||
public char[] convert(String source) {
|
||||
return source.toCharArray();
|
||||
}
|
||||
|
||||
}
|
||||
|
|
@ -188,6 +188,16 @@ public class ConfigurationPropertiesBindingPostProcessorTests {
|
|||
assertTrue("No init", ConfigurationPropertiesWithFactoryBean.factoryBeanInit);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void configurationPropertiesWithCharArray() throws Exception {
|
||||
this.context = new AnnotationConfigApplicationContext();
|
||||
EnvironmentTestUtils.addEnvironment(this.context, "test.chars:word");
|
||||
this.context.register(PropertyWithCharArray.class);
|
||||
this.context.refresh();
|
||||
assertThat(this.context.getBean(PropertyWithCharArray.class).getChars(),
|
||||
equalTo("word".toCharArray()));
|
||||
}
|
||||
|
||||
@Configuration
|
||||
@EnableConfigurationProperties
|
||||
public static class TestConfigurationWithValidatingSetter {
|
||||
|
|
@ -302,6 +312,23 @@ public class ConfigurationPropertiesBindingPostProcessorTests {
|
|||
|
||||
}
|
||||
|
||||
@Configuration
|
||||
@EnableConfigurationProperties
|
||||
@ConfigurationProperties(prefix = "test")
|
||||
public static class PropertyWithCharArray {
|
||||
|
||||
private char[] chars;
|
||||
|
||||
public char[] getChars() {
|
||||
return this.chars;
|
||||
}
|
||||
|
||||
public void setChars(char[] chars) {
|
||||
this.chars = chars;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@Configuration
|
||||
@EnableConfigurationProperties
|
||||
@ConfigurationProperties(prefix = "test")
|
||||
|
|
|
|||
Loading…
Reference in New Issue