0

需要明确的是,这具体是一个 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 实现?

顺便说一句,我不能直接注册枚举类,因为这段代码位于核心库中,我更希望编辑器在不知道它需要处理的所有枚举类的情况下以“硬编码”的形式注册感觉。如果可能的话,我更愿意像我尝试做的那样做。

有什么想法吗?如果您需要任何进一步的说明或代码,请告诉我,我会相应地提供。不过,对我来说,这里的关键问题是尝试注册我的自定义属性编辑器不起作用。为尚未处理的类添加编辑器,但不是已注册的类。

4

0 回答 0