Include information about a property’s origin in binding failures
This commit enhances RelaxedDataBinder to include information about the origin of a property (its original name before any prefix was removed and its source) when it encounters an unwritable property. For example, launching an application with a SERVER_HOME environment variable configured will produce the following failure message: Failed to bind 'SERVER_HOME' from 'systemEnvironment' to 'HOME' property on 'org.springframework.boot.autoconfigure.web.ServerProperties' Closes gh-3778pull/3807/head
parent
48f16c4386
commit
6bd6bc9e10
@ -0,0 +1,60 @@
|
|||||||
|
/*
|
||||||
|
* 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.
|
||||||
|
* 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.beans.PropertyValue;
|
||||||
|
import org.springframework.core.env.PropertySource;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A {@link PropertyValue} that can provide information about its origin.
|
||||||
|
*
|
||||||
|
* @author Andy Wilkinson
|
||||||
|
*/
|
||||||
|
class OriginCapablePropertyValue extends PropertyValue {
|
||||||
|
|
||||||
|
private static final String ATTRIBUTE_PROPERTY_ORIGIN = "propertyOrigin";
|
||||||
|
|
||||||
|
private final PropertyOrigin origin;
|
||||||
|
|
||||||
|
public OriginCapablePropertyValue(PropertyValue propertyValue) {
|
||||||
|
this(propertyValue.getName(), propertyValue.getValue(),
|
||||||
|
(PropertyOrigin) propertyValue.getAttribute(ATTRIBUTE_PROPERTY_ORIGIN));
|
||||||
|
}
|
||||||
|
|
||||||
|
public OriginCapablePropertyValue(String name, Object value, String originName,
|
||||||
|
PropertySource<?> originSource) {
|
||||||
|
this(name, value, new PropertyOrigin(originSource, originName));
|
||||||
|
}
|
||||||
|
|
||||||
|
public OriginCapablePropertyValue(String name, Object value, PropertyOrigin origin) {
|
||||||
|
super(name, value);
|
||||||
|
this.origin = origin;
|
||||||
|
setAttribute(ATTRIBUTE_PROPERTY_ORIGIN, origin);
|
||||||
|
}
|
||||||
|
|
||||||
|
public PropertyOrigin getOrigin() {
|
||||||
|
return this.origin;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String toString() {
|
||||||
|
String name = this.origin != null ? this.origin.getName() : this.getName();
|
||||||
|
String source = this.origin.getSource() != null ? this.origin.getSource()
|
||||||
|
.getName() : "unknown";
|
||||||
|
return "'" + name + "' from '" + source + "'";
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,47 @@
|
|||||||
|
/*
|
||||||
|
* 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.
|
||||||
|
* 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.env.PropertySource;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The origin of a property, specifically its source and its name before any prefix was
|
||||||
|
* removed.
|
||||||
|
*
|
||||||
|
* @author Andy Wilkinson
|
||||||
|
* @since 1.3.0
|
||||||
|
*/
|
||||||
|
public class PropertyOrigin {
|
||||||
|
|
||||||
|
private final PropertySource<?> source;
|
||||||
|
|
||||||
|
private final String name;
|
||||||
|
|
||||||
|
PropertyOrigin(PropertySource<?> source, String name) {
|
||||||
|
this.name = name;
|
||||||
|
this.source = source;
|
||||||
|
}
|
||||||
|
|
||||||
|
public PropertySource<?> getSource() {
|
||||||
|
return this.source;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getName() {
|
||||||
|
return this.name;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,54 @@
|
|||||||
|
/*
|
||||||
|
* 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.
|
||||||
|
* 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.beans.NotWritablePropertyException;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A custom {@link NotWritablePropertyException} that is thrown when a failure occurs
|
||||||
|
* during relaxed binding
|
||||||
|
*
|
||||||
|
* @see RelaxedDataBinder
|
||||||
|
* @author Andy Wilkinson
|
||||||
|
* @since 1.3.0
|
||||||
|
*/
|
||||||
|
public class RelaxedBindingNotWritablePropertyException extends
|
||||||
|
NotWritablePropertyException {
|
||||||
|
|
||||||
|
private final String message;
|
||||||
|
|
||||||
|
private final PropertyOrigin propertyOrigin;
|
||||||
|
|
||||||
|
RelaxedBindingNotWritablePropertyException(NotWritablePropertyException ex,
|
||||||
|
PropertyOrigin propertyOrigin) {
|
||||||
|
super(ex.getBeanClass(), ex.getPropertyName());
|
||||||
|
this.propertyOrigin = propertyOrigin;
|
||||||
|
this.message = "Failed to bind '" + propertyOrigin.getName() + "' from '"
|
||||||
|
+ propertyOrigin.getSource().getName() + "' to '" + ex.getPropertyName()
|
||||||
|
+ "' property on '" + ex.getBeanClass().getName() + "'";
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getMessage() {
|
||||||
|
return this.message;
|
||||||
|
}
|
||||||
|
|
||||||
|
public PropertyOrigin getPropertyOrigin() {
|
||||||
|
return this.propertyOrigin;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
Loading…
Reference in New Issue