|
||||||||||
PREV CLASS NEXT CLASS | FRAMES NO FRAMES | |||||||||
SUMMARY: NESTED | FIELD | CONSTR | METHOD | DETAIL: FIELD | CONSTR | METHOD |
java.lang.Objectorg.springframework.beans.BeanWrapperImpl
public class BeanWrapperImpl
Default implementation of the BeanWrapper interface that should be sufficient for all typical use cases. Caches introspection results for efficiency.
Note: This class never tries to load a class by name, as this can pose class loading problems in J2EE applications with multiple deployment modules. The caller is responsible for loading a target class.
Note: Auto-registers default property editors from the
org.springframework.beans.propertyeditors
package, which apply
in addition to the JDK's standard PropertyEditors. Applications can call
BeanWrapper's registerCustomEditor
method to register an editor
for the particular instance (i.e. they're not shared across the application).
BeanWrapperImpl will convert collection and array values to the
corresponding target collections or arrays, if necessary. Custom property
editors that deal with collections or arrays can either be written via
PropertyEditor's setValue
, or against a comma-delimited String
via setAsText
, as String arrays are converted in such a format
if the array itself is not assignable.
registerCustomEditor(java.lang.Class, java.beans.PropertyEditor)
,
PropertyEditorManager
,
PropertyEditorSupport.setAsText(java.lang.String)
,
PropertyEditorSupport.setValue(java.lang.Object)
,
ByteArrayPropertyEditor
,
ClassEditor
,
CharacterEditor
,
CustomBooleanEditor
,
CustomNumberEditor
,
CustomCollectionEditor
,
FileEditor
,
InputStreamEditor
,
JndiTemplateEditor
,
LocaleEditor
,
PropertiesEditor
,
PropertyValuesEditor
,
ResourceArrayPropertyEditor
,
ResourceEditor
,
StringArrayPropertyEditor
,
TransactionAttributeEditor
,
TransactionAttributeSourceEditor
,
URLEditor
Field Summary |
---|
Fields inherited from interface org.springframework.beans.PropertyAccessor |
---|
NESTED_PROPERTY_SEPARATOR, NESTED_PROPERTY_SEPARATOR_CHAR, PROPERTY_KEY_PREFIX, PROPERTY_KEY_PREFIX_CHAR, PROPERTY_KEY_SUFFIX, PROPERTY_KEY_SUFFIX_CHAR |
Constructor Summary | |
---|---|
BeanWrapperImpl()
Create new empty BeanWrapperImpl. |
|
BeanWrapperImpl(boolean registerDefaultEditors)
Create new empty BeanWrapperImpl. |
|
BeanWrapperImpl(Class clazz)
Create new BeanWrapperImpl, wrapping a new instance of the specified class. |
|
BeanWrapperImpl(Object object)
Create new BeanWrapperImpl for the given object. |
|
BeanWrapperImpl(Object object,
String nestedPath,
Object rootObject)
Create new BeanWrapperImpl for the given object, registering a nested path that the object is in. |
Method Summary | |
---|---|
Object |
doTypeConversionIfNecessary(Object newValue,
Class requiredType)
Convert the value to the required type (if necessary from a String). |
protected Object |
doTypeConversionIfNecessary(String propertyName,
String fullPropertyName,
Object oldValue,
Object newValue,
Class requiredType)
Convert the value to the required type (if necessary from a String), for the specified property. |
PropertyEditor |
findCustomEditor(Class requiredType,
String propertyPath)
Find a custom property editor for the given type and property. |
protected BeanWrapperImpl |
getBeanWrapperForPropertyPath(String propertyPath)
Recursively navigate to return a BeanWrapper for the nested property path. |
String |
getNestedPath()
Return the nested path of the object wrapped by this BeanWrapper. |
PropertyDescriptor |
getPropertyDescriptor(String propertyName)
Get the property descriptor for a particular property. |
protected PropertyDescriptor |
getPropertyDescriptorInternal(String propertyName)
Internal version of getPropertyDescriptor: Returns null if not found rather than throwing an exception. |
PropertyDescriptor[] |
getPropertyDescriptors()
Get the PropertyDescriptors identified on this object (standard JavaBeans introspection). |
Class |
getPropertyType(String propertyName)
Determine the property type for a particular property, either checking the property descriptor or checking the value in case of an indexed or mapped element. |
protected Object |
getPropertyValue(org.springframework.beans.BeanWrapperImpl.PropertyTokenHolder tokens)
|
Object |
getPropertyValue(String propertyName)
Get the value of a property. |
Class |
getRootClass()
Return the class of the root object at the top of the path of this BeanWrapper. |
Object |
getRootInstance()
Return the root object at the top of the path of this BeanWrapper. |
Class |
getWrappedClass()
Convenience method to return the class of the wrapped object. |
Object |
getWrappedInstance()
Return the bean wrapped by this object (cannot be null ). |
boolean |
isReadableProperty(String propertyName)
Return whether this property is readable. |
boolean |
isWritableProperty(String propertyName)
Return whether this property is writable. |
void |
registerCustomEditor(Class requiredType,
PropertyEditor propertyEditor)
Register the given custom property editor for all properties of the given type. |
void |
registerCustomEditor(Class requiredType,
String propertyPath,
PropertyEditor propertyEditor)
Register the given custom property editor for the given type and property, or for all properties of the given type. |
void |
setExtractOldValueForEditor(boolean extractOldValueForEditor)
Set whether to extract the old property value when applying a property editor to a new value for a property. |
protected void |
setIntrospectionClass(Class clazz)
Set the class to introspect. |
protected void |
setPropertyValue(org.springframework.beans.BeanWrapperImpl.PropertyTokenHolder tokens,
Object newValue)
|
void |
setPropertyValue(PropertyValue pv)
Update a property value. |
void |
setPropertyValue(String propertyName,
Object value)
Set a property value. |
void |
setPropertyValues(Map map)
Bulk update from a Map. |
void |
setPropertyValues(PropertyValues pvs)
The preferred way to perform a bulk update. |
void |
setPropertyValues(PropertyValues propertyValues,
boolean ignoreUnknown)
Perform a bulk update with full control over behavior. |
void |
setWrappedInstance(Object object)
Switch the target object, replacing the cached introspection results only if the class of the new object is different to that of the replaced object. |
void |
setWrappedInstance(Object object,
String nestedPath,
Object rootObject)
Switch the target object, replacing the cached introspection results only if the class of the new object is different to that of the replaced object. |
String |
toString()
|
Methods inherited from class java.lang.Object |
---|
clone, equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait |
Constructor Detail |
---|
public BeanWrapperImpl()
setWrappedInstance(java.lang.Object)
public BeanWrapperImpl(boolean registerDefaultEditors)
registerDefaultEditors
- whether to register default editors
(can be suppressed if the BeanWrapper won't need any type conversion)setWrappedInstance(java.lang.Object)
public BeanWrapperImpl(Object object)
object
- object wrapped by this BeanWrapperpublic BeanWrapperImpl(Class clazz)
clazz
- class to instantiate and wrappublic BeanWrapperImpl(Object object, String nestedPath, Object rootObject)
object
- object wrapped by this BeanWrapper.nestedPath
- the nested path of the objectrootObject
- the root object at the top of the pathMethod Detail |
---|
public void setWrappedInstance(Object object)
setWrappedInstance
in interface BeanWrapper
object
- new targetpublic void setWrappedInstance(Object object, String nestedPath, Object rootObject)
object
- new targetnestedPath
- the nested path of the objectrootObject
- the root object at the top of the pathpublic Object getWrappedInstance()
BeanWrapper
null
).
getWrappedInstance
in interface BeanWrapper
public Class getWrappedClass()
BeanWrapper
getWrappedClass
in interface BeanWrapper
public String getNestedPath()
public Object getRootInstance()
getNestedPath()
public Class getRootClass()
getNestedPath()
protected void setIntrospectionClass(Class clazz)
clazz
- the class to introspectpublic void setExtractOldValueForEditor(boolean extractOldValueForEditor)
BeanWrapper
Default is "false", avoiding side effects caused by getters. Turn this to "true" to expose previous property values to custom editors.
setExtractOldValueForEditor
in interface BeanWrapper
public void registerCustomEditor(Class requiredType, PropertyEditor propertyEditor)
BeanWrapper
registerCustomEditor
in interface BeanWrapper
requiredType
- type of the propertypropertyEditor
- editor to registerpublic void registerCustomEditor(Class requiredType, String propertyPath, PropertyEditor propertyEditor)
BeanWrapper
If the property path denotes an array or Collection property, the editor will get applied either to the array/Collection itself (the PropertyEditor has to create an array or Collection value) or to each element (the PropertyEditor has to create the element type), depending on the specified required type.
Note: Only one single registered custom editor per property path is supported. In case of a Collection/array, do not register an editor for both the Collection/array and each element on the same property.
registerCustomEditor
in interface BeanWrapper
requiredType
- type of the property (can be null
if a property is
given but should be specified in any case for consistency checking)propertyPath
- path of the property (name or nested path), or
null if registering an editor for all properties of the given typepropertyEditor
- editor to registerpublic PropertyEditor findCustomEditor(Class requiredType, String propertyPath)
BeanWrapper
findCustomEditor
in interface BeanWrapper
requiredType
- type of the property (can be null
if a property is
given but should be specified in any case for consistency checking)propertyPath
- path of the property (name or nested path), or
null if looking for an editor for all properties of the given type
null
if noneprotected BeanWrapperImpl getBeanWrapperForPropertyPath(String propertyPath) throws BeansException
propertyPath
- property property path, which may be nested
BeansException
public Object getPropertyValue(String propertyName) throws BeansException
PropertyAccessor
getPropertyValue
in interface PropertyAccessor
propertyName
- name of the property to get the value of
FatalBeanException
- if there is no such property, if the property
isn't readable, or if the property getter throws an exception.
BeansException
protected Object getPropertyValue(org.springframework.beans.BeanWrapperImpl.PropertyTokenHolder tokens) throws BeansException
BeansException
public void setPropertyValue(String propertyName, Object value) throws BeansException
PropertyAccessor
setPropertyValue
in interface PropertyAccessor
propertyName
- name of the property to set value ofvalue
- the new value
FatalBeanException
- if there is no such property, if the property
isn't writable, or if the property setter throws an exception.
BeansException
protected void setPropertyValue(org.springframework.beans.BeanWrapperImpl.PropertyTokenHolder tokens, Object newValue) throws BeansException
BeansException
public void setPropertyValue(PropertyValue pv) throws BeansException
PropertyAccessor
setPropertyValue
in interface PropertyAccessor
pv
- object containing new property value
FatalBeanException
- if there is no such property, if the property
isn't writable, or if the property setter throws an exception.
BeansException
public void setPropertyValues(Map map) throws BeansException
setPropertyValues
in interface PropertyAccessor
map
- map containing properties to set, as name-value pairs.
The map may include nested properties.
BeansException
- if there's a fatal, low-level exceptionpublic void setPropertyValues(PropertyValues pvs) throws BeansException
PropertyAccessor
Note that performing a bulk update differs from performing a single update, in that an implementation of this class will continue to update properties if a recoverable error (such as a type mismatch, but not an invalid field name or the like) is encountered, throwing a PropertyAccessExceptionsException containing all the individual errors. This exception can be examined later to see all binding errors. Properties that were successfully updated stay changed.
Does not allow unknown fields. Equivalent to setPropertyValues(pvs, false).
setPropertyValues
in interface PropertyAccessor
pvs
- PropertyValues to set on the target object
FatalBeanException
- if there is no such property, if the property
isn't writable, or if the property setter throws an exception.
BeansException
PropertyAccessor.setPropertyValues(PropertyValues, boolean)
public void setPropertyValues(PropertyValues propertyValues, boolean ignoreUnknown) throws BeansException
PropertyAccessor
Note that performing a bulk update differs from performing a single update, in that an implementation of this class will continue to update properties if a recoverable error (such as a type mismatch, but not an invalid field name or the like) is encountered, throwing a PropertyAccessExceptionsException containing all the individual errors. This exception can be examined later to see all binding errors. Properties that were successfully updated stay changed.
Does not allow unknown fields.
setPropertyValues
in interface PropertyAccessor
propertyValues
- PropertyValues to set on the target objectignoreUnknown
- should we ignore unknown values (not found in the bean)
FatalBeanException
- if there is no such property, if the property
isn't writable, or if the property setter throws an exception.
BeansException
public Object doTypeConversionIfNecessary(Object newValue, Class requiredType) throws TypeMismatchException
Conversions from String to any type use the setAsText
method
of the PropertyEditor class. Note that a PropertyEditor must be registered
for the given class for this to work; this is a standard JavaBeans API.
A number of PropertyEditors are automatically registered by BeanWrapperImpl.
newValue
- proposed change valuerequiredType
- the type we must convert to
TypeMismatchException
- if type conversion failedPropertyEditor.setAsText(String)
,
PropertyEditor.getValue()
protected Object doTypeConversionIfNecessary(String propertyName, String fullPropertyName, Object oldValue, Object newValue, Class requiredType) throws TypeMismatchException
propertyName
- name of the propertyoldValue
- previous value, if available (may be null
)newValue
- proposed change valuerequiredType
- the type we must convert to
(or null
if not known, for example in case of a collection element)
TypeMismatchException
- if type conversion failedpublic PropertyDescriptor[] getPropertyDescriptors()
BeanWrapper
getPropertyDescriptors
in interface BeanWrapper
public PropertyDescriptor getPropertyDescriptor(String propertyName) throws BeansException
BeanWrapper
getPropertyDescriptor
in interface BeanWrapper
propertyName
- property to check status for
InvalidPropertyException
- if there is no such property
BeansException
protected PropertyDescriptor getPropertyDescriptorInternal(String propertyName) throws BeansException
BeansException
public Class getPropertyType(String propertyName) throws BeansException
BeanWrapper
getPropertyType
in interface BeanWrapper
propertyName
- property to check status for
null
if not
determinable (can only happen with an indexed or mapped element)
InvalidPropertyException
- if there is no such property
BeansException
public boolean isReadableProperty(String propertyName)
BeanWrapper
isReadableProperty
in interface BeanWrapper
propertyName
- property to check status for
public boolean isWritableProperty(String propertyName)
BeanWrapper
isWritableProperty
in interface BeanWrapper
propertyName
- property to check status for
public String toString()
toString
in class Object
|
||||||||||
PREV CLASS NEXT CLASS | FRAMES NO FRAMES | |||||||||
SUMMARY: NESTED | FIELD | CONSTR | METHOD | DETAIL: FIELD | CONSTR | METHOD |