From 0b50fe4eff29fdc0ec025281703c7bb3b9e22705 Mon Sep 17 00:00:00 2001 From: Phillip Webb Date: Wed, 24 Sep 2014 16:03:51 -0700 Subject: [PATCH] Support String to char[] bindings Update RelaxedConversionService to also support String to char[] conversion. Primarily to support the `password` field in MongoProperties. Fixes gh-1572 --- .../mongo/MongoPropertiesTests.java | 52 +++++++++++++++++++ .../boot/bind/RelaxedConversionService.java | 1 + .../boot/bind/StringToCharArrayConverter.java | 33 ++++++++++++ ...onPropertiesBindingPostProcessorTests.java | 27 ++++++++++ 4 files changed, 113 insertions(+) create mode 100644 spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/mongo/MongoPropertiesTests.java create mode 100644 spring-boot/src/main/java/org/springframework/boot/bind/StringToCharArrayConverter.java diff --git a/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/mongo/MongoPropertiesTests.java b/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/mongo/MongoPropertiesTests.java new file mode 100644 index 00000000000..60105a2a522 --- /dev/null +++ b/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/mongo/MongoPropertiesTests.java @@ -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 { + + } + +} diff --git a/spring-boot/src/main/java/org/springframework/boot/bind/RelaxedConversionService.java b/spring-boot/src/main/java/org/springframework/boot/bind/RelaxedConversionService.java index 626f704a072..a645e94cb84 100644 --- a/spring-boot/src/main/java/org/springframework/boot/bind/RelaxedConversionService.java +++ b/spring-boot/src/main/java/org/springframework/boot/bind/RelaxedConversionService.java @@ -49,6 +49,7 @@ class RelaxedConversionService implements ConversionService { this.additionalConverters = new GenericConversionService(); this.additionalConverters .addConverterFactory(new StringToEnumIgnoringCaseConverterFactory()); + this.additionalConverters.addConverter(new StringToCharArrayConverter()); } @Override diff --git a/spring-boot/src/main/java/org/springframework/boot/bind/StringToCharArrayConverter.java b/spring-boot/src/main/java/org/springframework/boot/bind/StringToCharArrayConverter.java new file mode 100644 index 00000000000..1c3e20bcbb8 --- /dev/null +++ b/spring-boot/src/main/java/org/springframework/boot/bind/StringToCharArrayConverter.java @@ -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 { + + @Override + public char[] convert(String source) { + return source.toCharArray(); + } + +} diff --git a/spring-boot/src/test/java/org/springframework/boot/context/properties/ConfigurationPropertiesBindingPostProcessorTests.java b/spring-boot/src/test/java/org/springframework/boot/context/properties/ConfigurationPropertiesBindingPostProcessorTests.java index bf066fbebf5..586c99e4d0b 100644 --- a/spring-boot/src/test/java/org/springframework/boot/context/properties/ConfigurationPropertiesBindingPostProcessorTests.java +++ b/spring-boot/src/test/java/org/springframework/boot/context/properties/ConfigurationPropertiesBindingPostProcessorTests.java @@ -168,6 +168,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 { @@ -282,6 +292,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")