ConversionService is able to apply Converters to interface-based array elements (SPR-7150); a context ConversionService is able to override an ApplicationContext's resource editors (SPR-7079)
This commit is contained in:
@@ -93,6 +93,8 @@ public class PropertyEditorRegistrySupport implements PropertyEditorRegistry {
|
||||
|
||||
private Map<Class, PropertyEditor> defaultEditors;
|
||||
|
||||
private Map<Class, PropertyEditor> overriddenDefaultEditors;
|
||||
|
||||
private Map<Class, PropertyEditor> customEditors;
|
||||
|
||||
private Map<String, CustomEditorHolder> customEditorsForPath;
|
||||
@@ -141,6 +143,22 @@ public class PropertyEditorRegistrySupport implements PropertyEditorRegistry {
|
||||
this.configValueEditorsActive = true;
|
||||
}
|
||||
|
||||
/**
|
||||
* Override the default editor for the specified type with the given property editor.
|
||||
* <p>Note that this is different from registering a custom editor in that the editor
|
||||
* semantically still is a default editor. A ConversionService will override such a
|
||||
* default editor, whereas custom editors usually override the ConversionService.
|
||||
* @param requiredType the type of the property
|
||||
* @param propertyEditor the editor to register
|
||||
* @see #registerCustomEditor(Class, PropertyEditor)
|
||||
*/
|
||||
public void overrideDefaultEditor(Class requiredType, PropertyEditor propertyEditor) {
|
||||
if (this.overriddenDefaultEditors == null) {
|
||||
this.overriddenDefaultEditors = new HashMap<Class, PropertyEditor>();
|
||||
}
|
||||
this.overriddenDefaultEditors.put(requiredType, propertyEditor);
|
||||
}
|
||||
|
||||
/**
|
||||
* Retrieve the default editor for the given property type, if any.
|
||||
* <p>Lazily registers the default editors, if they are active.
|
||||
@@ -152,8 +170,14 @@ public class PropertyEditorRegistrySupport implements PropertyEditorRegistry {
|
||||
if (!this.defaultEditorsActive) {
|
||||
return null;
|
||||
}
|
||||
if (this.overriddenDefaultEditors != null) {
|
||||
PropertyEditor editor = this.overriddenDefaultEditors.get(requiredType);
|
||||
if (editor != null) {
|
||||
return editor;
|
||||
}
|
||||
}
|
||||
if (this.defaultEditors == null) {
|
||||
doRegisterDefaultEditors();
|
||||
createDefaultEditors();
|
||||
}
|
||||
return this.defaultEditors.get(requiredType);
|
||||
}
|
||||
@@ -161,7 +185,7 @@ public class PropertyEditorRegistrySupport implements PropertyEditorRegistry {
|
||||
/**
|
||||
* Actually register the default editors for this registry instance.
|
||||
*/
|
||||
private void doRegisterDefaultEditors() {
|
||||
private void createDefaultEditors() {
|
||||
this.defaultEditors = new HashMap<Class, PropertyEditor>(64);
|
||||
|
||||
// Simple editors, without parameterization capabilities.
|
||||
@@ -234,9 +258,10 @@ public class PropertyEditorRegistrySupport implements PropertyEditorRegistry {
|
||||
* @param target the target registry to copy to
|
||||
*/
|
||||
protected void copyDefaultEditorsTo(PropertyEditorRegistrySupport target) {
|
||||
target.defaultEditors = this.defaultEditors;
|
||||
target.defaultEditorsActive = this.defaultEditorsActive;
|
||||
target.configValueEditorsActive = this.configValueEditorsActive;
|
||||
target.defaultEditors = this.defaultEditors;
|
||||
target.overriddenDefaultEditors = this.overriddenDefaultEditors;
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2002-2007 the original author or authors.
|
||||
* Copyright 2002-2010 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.
|
||||
@@ -16,6 +16,7 @@
|
||||
|
||||
package org.springframework.beans.support;
|
||||
|
||||
import java.beans.PropertyEditor;
|
||||
import java.io.File;
|
||||
import java.io.InputStream;
|
||||
import java.net.URI;
|
||||
@@ -25,6 +26,7 @@ import org.xml.sax.InputSource;
|
||||
|
||||
import org.springframework.beans.PropertyEditorRegistrar;
|
||||
import org.springframework.beans.PropertyEditorRegistry;
|
||||
import org.springframework.beans.PropertyEditorRegistrySupport;
|
||||
import org.springframework.beans.propertyeditors.ClassEditor;
|
||||
import org.springframework.beans.propertyeditors.FileEditor;
|
||||
import org.springframework.beans.propertyeditors.InputSourceEditor;
|
||||
@@ -80,20 +82,33 @@ public class ResourceEditorRegistrar implements PropertyEditorRegistrar {
|
||||
*/
|
||||
public void registerCustomEditors(PropertyEditorRegistry registry) {
|
||||
ResourceEditor baseEditor = new ResourceEditor(this.resourceLoader);
|
||||
registry.registerCustomEditor(Resource.class, baseEditor);
|
||||
registry.registerCustomEditor(InputStream.class, new InputStreamEditor(baseEditor));
|
||||
registry.registerCustomEditor(InputSource.class, new InputSourceEditor(baseEditor));
|
||||
registry.registerCustomEditor(File.class, new FileEditor(baseEditor));
|
||||
registry.registerCustomEditor(URL.class, new URLEditor(baseEditor));
|
||||
doRegisterEditor(registry, Resource.class, baseEditor);
|
||||
doRegisterEditor(registry, InputStream.class, new InputStreamEditor(baseEditor));
|
||||
doRegisterEditor(registry, InputSource.class, new InputSourceEditor(baseEditor));
|
||||
doRegisterEditor(registry, File.class, new FileEditor(baseEditor));
|
||||
doRegisterEditor(registry, URL.class, new URLEditor(baseEditor));
|
||||
|
||||
ClassLoader classLoader = this.resourceLoader.getClassLoader();
|
||||
registry.registerCustomEditor(Class.class, new ClassEditor(classLoader));
|
||||
registry.registerCustomEditor(URI.class, new URIEditor(classLoader));
|
||||
doRegisterEditor(registry, Class.class, new ClassEditor(classLoader));
|
||||
doRegisterEditor(registry, URI.class, new URIEditor(classLoader));
|
||||
|
||||
if (this.resourceLoader instanceof ResourcePatternResolver) {
|
||||
registry.registerCustomEditor(Resource[].class,
|
||||
doRegisterEditor(registry, Resource[].class,
|
||||
new ResourceArrayPropertyEditor((ResourcePatternResolver) this.resourceLoader));
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Override default editor, if possible (since that's what we really mean to do here);
|
||||
* otherwise register as a custom editor.
|
||||
*/
|
||||
private void doRegisterEditor(PropertyEditorRegistry registry, Class requiredType, PropertyEditor editor) {
|
||||
if (registry instanceof PropertyEditorRegistrySupport) {
|
||||
((PropertyEditorRegistrySupport) registry).overrideDefaultEditor(requiredType, editor);
|
||||
}
|
||||
else {
|
||||
registry.registerCustomEditor(requiredType, editor);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user