Add exclusion for well-known property types
Previously, any valid property was added to the meta-data of the current group. This can be annoying for types that are not meant to be bound from a simple string value. ClassLoader is one example. A list of well-known types has been added: if the property type matches an element of this list, it is ignored. Fixes gh-2012
This commit is contained in:
parent
4c7cc58a19
commit
3922808de0
|
|
@ -75,6 +75,8 @@ public class ConfigurationMetadataAnnotationProcessor extends AbstractProcessor
|
||||||
|
|
||||||
private FieldValuesParser fieldValuesParser;
|
private FieldValuesParser fieldValuesParser;
|
||||||
|
|
||||||
|
private ElementExcludeFilter elementExcludeFilter = new ElementExcludeFilter();
|
||||||
|
|
||||||
protected String configurationPropertiesAnnotation() {
|
protected String configurationPropertiesAnnotation() {
|
||||||
return CONFIGURATION_PROPERTIES_ANNOTATION;
|
return CONFIGURATION_PROPERTIES_ANNOTATION;
|
||||||
}
|
}
|
||||||
|
|
@ -177,10 +179,11 @@ public class ConfigurationMetadataAnnotationProcessor extends AbstractProcessor
|
||||||
VariableElement field = members.getFields().get(name);
|
VariableElement field = members.getFields().get(name);
|
||||||
Element returnType = this.processingEnv.getTypeUtils().asElement(
|
Element returnType = this.processingEnv.getTypeUtils().asElement(
|
||||||
getter.getReturnType());
|
getter.getReturnType());
|
||||||
|
boolean isExcluded = this.elementExcludeFilter.isExcluded(returnType);
|
||||||
boolean isNested = isNested(returnType, field, element);
|
boolean isNested = isNested(returnType, field, element);
|
||||||
boolean isCollection = this.typeUtils.isCollectionOrMap(getter
|
boolean isCollection = this.typeUtils.isCollectionOrMap(getter
|
||||||
.getReturnType());
|
.getReturnType());
|
||||||
if (!isNested && (setter != null || isCollection)) {
|
if (!isExcluded && !isNested && (setter != null || isCollection)) {
|
||||||
String dataType = this.typeUtils.getType(getter.getReturnType());
|
String dataType = this.typeUtils.getType(getter.getReturnType());
|
||||||
String sourceType = this.typeUtils.getType(element);
|
String sourceType = this.typeUtils.getType(element);
|
||||||
String description = this.typeUtils.getJavaDoc(field);
|
String description = this.typeUtils.getJavaDoc(field);
|
||||||
|
|
|
||||||
|
|
@ -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.configurationprocessor;
|
||||||
|
|
||||||
|
import java.util.HashSet;
|
||||||
|
import java.util.Set;
|
||||||
|
|
||||||
|
import javax.lang.model.element.Element;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Filter to excluded elements that don't make sense to process.
|
||||||
|
*
|
||||||
|
* @author Stephane Nicoll
|
||||||
|
* @since 1.2.0
|
||||||
|
*/
|
||||||
|
class ElementExcludeFilter {
|
||||||
|
|
||||||
|
private final Set<String> excludes = new HashSet<String>();
|
||||||
|
|
||||||
|
public ElementExcludeFilter() {
|
||||||
|
add("java.io.Writer");
|
||||||
|
add("java.io.PrintWriter");
|
||||||
|
add("javax.sql.DataSource");
|
||||||
|
add("java.lang.ClassLoader");
|
||||||
|
}
|
||||||
|
|
||||||
|
private void add(String className) {
|
||||||
|
this.excludes.add(className);
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean isExcluded(Element element) {
|
||||||
|
if (element == null) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
return this.excludes.contains(element.toString());
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
@ -30,7 +30,6 @@ import org.springframework.boot.configurationsample.method.EmptyTypeMethodConfig
|
||||||
import org.springframework.boot.configurationsample.method.InvalidMethodConfig;
|
import org.springframework.boot.configurationsample.method.InvalidMethodConfig;
|
||||||
import org.springframework.boot.configurationsample.method.MethodAndClassConfig;
|
import org.springframework.boot.configurationsample.method.MethodAndClassConfig;
|
||||||
import org.springframework.boot.configurationsample.method.SimpleMethodConfig;
|
import org.springframework.boot.configurationsample.method.SimpleMethodConfig;
|
||||||
import org.springframework.boot.configurationsample.simple.DeprecatedProperties;
|
|
||||||
import org.springframework.boot.configurationsample.simple.HierarchicalProperties;
|
import org.springframework.boot.configurationsample.simple.HierarchicalProperties;
|
||||||
import org.springframework.boot.configurationsample.simple.NotAnnotated;
|
import org.springframework.boot.configurationsample.simple.NotAnnotated;
|
||||||
import org.springframework.boot.configurationsample.simple.SimpleCollectionProperties;
|
import org.springframework.boot.configurationsample.simple.SimpleCollectionProperties;
|
||||||
|
|
@ -38,6 +37,7 @@ import org.springframework.boot.configurationsample.simple.SimplePrefixValueProp
|
||||||
import org.springframework.boot.configurationsample.simple.SimpleProperties;
|
import org.springframework.boot.configurationsample.simple.SimpleProperties;
|
||||||
import org.springframework.boot.configurationsample.simple.SimpleTypeProperties;
|
import org.springframework.boot.configurationsample.simple.SimpleTypeProperties;
|
||||||
import org.springframework.boot.configurationsample.specific.BuilderPojo;
|
import org.springframework.boot.configurationsample.specific.BuilderPojo;
|
||||||
|
import org.springframework.boot.configurationsample.specific.ExcludedTypesPojo;
|
||||||
import org.springframework.boot.configurationsample.specific.InnerClassAnnotatedGetterConfig;
|
import org.springframework.boot.configurationsample.specific.InnerClassAnnotatedGetterConfig;
|
||||||
import org.springframework.boot.configurationsample.specific.InnerClassProperties;
|
import org.springframework.boot.configurationsample.specific.InnerClassProperties;
|
||||||
import org.springframework.boot.configurationsample.specific.InnerClassRootConfig;
|
import org.springframework.boot.configurationsample.specific.InnerClassRootConfig;
|
||||||
|
|
@ -145,21 +145,16 @@ public class ConfigurationMetadataAnnotationProcessorTests {
|
||||||
.fromSource(HierarchicalProperties.class));
|
.fromSource(HierarchicalProperties.class));
|
||||||
}
|
}
|
||||||
|
|
||||||
@SuppressWarnings("deprecation")
|
|
||||||
@Test
|
@Test
|
||||||
|
@SuppressWarnings("deprecation")
|
||||||
public void deprecatedProperties() throws Exception {
|
public void deprecatedProperties() throws Exception {
|
||||||
ConfigurationMetadata metadata = compile(DeprecatedProperties.class);
|
Class<?> type = org.springframework.boot.configurationsample.simple.DeprecatedProperties.class;
|
||||||
assertThat(metadata, containsGroup("deprecated").fromSource(DeprecatedProperties.class));
|
ConfigurationMetadata metadata = compile(type);
|
||||||
assertThat(
|
assertThat(metadata, containsGroup("deprecated").fromSource(type));
|
||||||
metadata,
|
assertThat(metadata, containsProperty("deprecated.name", String.class)
|
||||||
containsProperty("deprecated.name", String.class)
|
.fromSource(type).withDeprecated());
|
||||||
.fromSource(DeprecatedProperties.class)
|
assertThat(metadata, containsProperty("deprecated.description", String.class)
|
||||||
.withDeprecated());
|
.fromSource(type).withDeprecated());
|
||||||
assertThat(
|
|
||||||
metadata,
|
|
||||||
containsProperty("deprecated.description", String.class)
|
|
||||||
.fromSource(DeprecatedProperties.class)
|
|
||||||
.withDeprecated());
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
|
|
@ -279,6 +274,16 @@ public class ConfigurationMetadataAnnotationProcessorTests {
|
||||||
assertThat(metadata, containsProperty("builder.name"));
|
assertThat(metadata, containsProperty("builder.name"));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void excludedTypesPojo() throws IOException {
|
||||||
|
ConfigurationMetadata metadata = compile(ExcludedTypesPojo.class);
|
||||||
|
assertThat(metadata, containsProperty("excluded.name"));
|
||||||
|
assertThat(metadata, not(containsProperty("excluded.class-loader")));
|
||||||
|
assertThat(metadata, not(containsProperty("excluded.data-source")));
|
||||||
|
assertThat(metadata, not(containsProperty("excluded.print-writer")));
|
||||||
|
assertThat(metadata, not(containsProperty("excluded.writer")));
|
||||||
|
}
|
||||||
|
|
||||||
private ConfigurationMetadata compile(Class<?>... types) throws IOException {
|
private ConfigurationMetadata compile(Class<?>... types) throws IOException {
|
||||||
TestConfigurationMetadataAnnotationProcessor processor = new TestConfigurationMetadataAnnotationProcessor();
|
TestConfigurationMetadataAnnotationProcessor processor = new TestConfigurationMetadataAnnotationProcessor();
|
||||||
new TestCompiler(this.temporaryFolder).getTask(types).call(processor);
|
new TestCompiler(this.temporaryFolder).getTask(types).call(processor);
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,85 @@
|
||||||
|
/*
|
||||||
|
* 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.configurationsample.specific;
|
||||||
|
|
||||||
|
import java.io.PrintWriter;
|
||||||
|
import java.io.Writer;
|
||||||
|
|
||||||
|
import javax.sql.DataSource;
|
||||||
|
|
||||||
|
import org.springframework.boot.configurationsample.ConfigurationProperties;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sample config with types that should not be added to the meta-data as we have no way to
|
||||||
|
* bind them from simple strings.
|
||||||
|
*
|
||||||
|
* @author Stephane Nicoll
|
||||||
|
*/
|
||||||
|
@ConfigurationProperties(prefix = "excluded")
|
||||||
|
public class ExcludedTypesPojo {
|
||||||
|
|
||||||
|
private String name;
|
||||||
|
|
||||||
|
private ClassLoader classLoader;
|
||||||
|
|
||||||
|
private DataSource dataSource;
|
||||||
|
|
||||||
|
private PrintWriter printWriter;
|
||||||
|
|
||||||
|
private Writer writer;
|
||||||
|
|
||||||
|
public String getName() {
|
||||||
|
return this.name;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setName(String name) {
|
||||||
|
this.name = name;
|
||||||
|
}
|
||||||
|
|
||||||
|
public ClassLoader getClassLoader() {
|
||||||
|
return this.classLoader;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setClassLoader(ClassLoader classLoader) {
|
||||||
|
this.classLoader = classLoader;
|
||||||
|
}
|
||||||
|
|
||||||
|
public DataSource getDataSource() {
|
||||||
|
return this.dataSource;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setDataSource(DataSource dataSource) {
|
||||||
|
this.dataSource = dataSource;
|
||||||
|
}
|
||||||
|
|
||||||
|
public PrintWriter getPrintWriter() {
|
||||||
|
return this.printWriter;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setPrintWriter(PrintWriter printWriter) {
|
||||||
|
this.printWriter = printWriter;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Writer getWriter() {
|
||||||
|
return this.writer;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setWriter(Writer writer) {
|
||||||
|
this.writer = writer;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
Loading…
Reference in New Issue