需要明确的是,这具体是一个 Java 8 问题。
我有一个类,用于将 Map<String, String>、值选择函数等绑定到模型,我使用以下代码查找给定 PropertyDescriptor 类型所需的编辑器。
final PropertyEditor editor = PropertyEditorManager.findEditor(descriptor.getPropertyType());
在有问题的类中,我有一个静态代码块,它为其他类型注册额外的属性编辑器,如下所示:
static {
PropertyEditorManager.registerEditor(Timestamp.class, TimestampEditor.class);
PropertyEditorManager.registerEditor(Date.class, DateEditor.class);
PropertyEditorManager.registerEditor(LocalDate.class, LocalDateEditor.class);
PropertyEditorManager.registerEditor(LocalTime.class, LocalTimeEditor.class);
PropertyEditorManager.registerEditor(LocalDateTime.class, LocalDateTimeEditor.class);
PropertyEditorManager.registerEditor(BigInteger.class, BigIntegerEditor.class);
PropertyEditorManager.registerEditor(BigDecimal.class, BigDecimalEditor.class);
PropertyEditorManager.registerEditor(File.class, FileEditor.class);
PropertyEditorManager.registerEditor(Path.class, PathEditor.class);
PropertyEditorManager.registerEditor(URL.class, UrlEditor.class);
PropertyEditorManager.registerEditor(Class.class, ClassEditor.class);
}
这对我很有用,因为我可以轻松地基于 String 值绑定到上述类型。
我正在寻求实现一个枚举编辑器,它不仅可以获取枚举常量文本值,还可以将索引作为字符串并仍然绑定。
不幸的是,Java本身提供的EnumEditor只允许枚举常量文本值,不允许索引,也不允许子类化,所以我尝试了这个类:
package com.csa.model.bean.editor;
import com.csa.math.NumberUtil;
import com.sun.beans.editors.EnumEditor;
import java.awt.Component;
import java.beans.PropertyEditorSupport;
public class IndexedEnumEditor extends PropertyEditorSupport {
private final EnumEditor enumEditor;
public IndexedEnumEditor(final Class<? extends Enum<?>> clazz) {
super();
this.enumEditor = new EnumEditor(clazz);
}
@Override
public Object getValue() {
return this.enumEditor.getValue();
}
@Override
public String getAsText() {
return this.enumEditor.getAsText();
}
@Override
public String getJavaInitializationString() {
return this.enumEditor.getJavaInitializationString();
}
@Override
public String[] getTags() {
return this.enumEditor.getTags();
}
@Override
public Component getCustomEditor() {
return this.enumEditor.getCustomEditor();
}
@Override
public void setAsText(final String text) throws IllegalArgumentException {
final String textToUse;
if (NumberUtil.isInteger(text)) {
final int index = NumberUtil.getInt(text, -1);
final String[] tags = this.getTags();
NumberUtil.requireBetween(index, 0, tags.length - 1);
textToUse = tags[index];
} else {
textToUse = text;
}
this.enumEditor.setAsText(textToUse);
}
@Override
public void setValue(final Object value) {
this.enumEditor.setValue(value);
}
}
在我的静态代码块中,我尝试通过以下方式添加这个新的属性编辑器:
PropertyEditorManager.registerEditor(Enum.class, IndexedEnumEditor.class);
但是,这不会用我的新 EnumEditor 覆盖现有的 EnumEditor。当调用 findEditor 时,我仍然得到 Java EnumEditor 实现而不是我自己的。
任何人都知道我怎样才能成功地覆盖 Java 实现?
顺便说一句,我不能直接注册枚举类,因为这段代码位于核心库中,我更希望编辑器在不知道它需要处理的所有枚举类的情况下以“硬编码”的形式注册感觉。如果可能的话,我更愿意像我尝试做的那样做。
有什么想法吗?如果您需要任何进一步的说明或代码,请告诉我,我会相应地提供。不过,对我来说,这里的关键问题是尝试注册我的自定义属性编辑器不起作用。为尚未处理的类添加编辑器,但不是已注册的类。