Свойство setLabel вызывает NPE - PullRequest
0 голосов
/ 27 ноября 2018

Я пробую BoundTableModel в первый раз, и когда я попытался установить метки своих свойств, я получил NullPointerException.

[EDT] 0:0:8,239 - Exception: java.lang.NullPointerException - null
java.lang.NullPointerException
    at com.codename1.properties.PropertyBase.putClientProperty(PropertyBase.java:131)
    at com.codename1.properties.PropertyBase.setLabel(PropertyBase.java:192)
    at our.app.forms.UnitsForm.<init>(UnitsForm.java:54)

NPE выбрасываетсяв этом блоке кода, но я не понимаю, почему.properties имеют значение public final и создаются в пределах UserHistory, но метка там не установлена.Лучше установить их позже, так как они должны быть переведены нашим TranslationManager.

UiBinding ui = new UiBinding();
List<UserHistory> histories = RestManager.getHistory();
UserHistory prototype = new UserHistory();
prototype.dateCreate.setLabel("Date"); 
prototype.balanceUpdate.setLabel("Variation"); 
prototype.action.setLabel("Action");

UiBinding.BoundTableModel tb = ui.createTableModel(histories, prototype);
tb.setColumnOrder(prototype.dateCreate, prototype.balanceUpdate, prototype.action);
Table table = new Table(tb);

Я не понимаю, как setLabel(String) из Property может бросить NullPointerException, любойидея?

РЕДАКТИРОВАТЬ: Вот классы, которые не удается, во-первых это AbstractEntity:

public abstract class AbstractEntity implements Serializable, PropertyBusinessObject 
{
    public final LongProperty<AbstractEntity> id = new LongProperty<>("id");

    public final IntProperty<AbstractEntity> version = new IntProperty<>("version");

    public final Property<Date, AbstractEntity> dateCreate = new Property<>("dateCreate", Date.class);

    public final Property<Date, AbstractEntity> dateUpdate = new Property<>("dateUpdate", Date.class);

    protected List<PropertyBase> getPropertyList() 
    {
        List<PropertyBase> list = new ArrayList<>();
        list.add(id);
        list.add(version);
        list.add(dateCreate);
        list.add(dateUpdate);
        return list;
    }

    protected List<PropertyBase> getExcludePropertyList()
    {
        List<PropertyBase> list = new ArrayList<>();
        return list;
    }

    @Override
    public PropertyIndex getPropertyIndex()
    {
        PropertyBase[] properties = getPropertyList().toArray(new PropertyBase[getPropertyList().size()]);
        PropertyIndex index =  new PropertyIndex(this, getName(), properties);

        for(PropertyBase excluded : getExcludePropertyList())
        {
            index.setExcludeFromJSON(excluded, true);
            index.setExcludeFromMap(excluded, true);
        }

        return index;
    }
}

А вот дочерний класс, который я пытался показать в таблице:

public class UserHistory extends AbstractEntity 
{

    public final Property<User, UserHistory> user = new Property<>("user", User.class);

    public final DoubleProperty<UserHistory> balanceUpdate = new DoubleProperty<>("balanceUpdate");

    public final Property<String, UserHistory> action = new Property<>("action");

    public UserHistory() {}

    @SuppressWarnings("rawtypes")
    protected List<PropertyBase> getPropertyList() 
    {
        List<PropertyBase> list = super.getPropertyList();
        list.add(user);
        list.add(balanceUpdate);
        list.add(action);
        return list;
    }
}

1 Ответ

0 голосов
/ 28 ноября 2018

Это не сработает.

Ваш подход интересен, но он ведет себя иначе, чем обычная реализация, одним существенным образом: индекс создается лениво.Таким образом, работа по инициализации, выполняемая индексом, на самом деле не происходит во всех случаях.

Хуже того, вы создаете несколько индексов при каждом вызове метода get, что также проблематично.

Что-то, что "может"работа такова:

public abstract class AbstractEntity implements Serializable, PropertyBusinessObject 
{
    public final LongProperty<AbstractEntity> id = new LongProperty<>("id");

    public final IntProperty<AbstractEntity> version = new IntProperty<>("version");

    public final Property<Date, AbstractEntity> dateCreate = new Property<>("dateCreate", Date.class);

    public final Property<Date, AbstractEntity> dateUpdate = new Property<>("dateUpdate", Date.class);

    private PropertyIndex index;


    protected AbstractEntity() {
        getPropertyIndex();
    }

    protected List<PropertyBase> getPropertyList() 
    {
        List<PropertyBase> list = new ArrayList<>();
        list.add(id);
        list.add(version);
        list.add(dateCreate);
        list.add(dateUpdate);
        return list;
    }

    protected List<PropertyBase> getExcludePropertyList()
    {
        List<PropertyBase> list = new ArrayList<>();
        return list;
    }

    @Override
    public PropertyIndex getPropertyIndex()
    {
        if(idx == null) {
            PropertyBase[] properties = getPropertyList().toArray(new PropertyBase[getPropertyList().size()]);
            index =  new PropertyIndex(this, getName(), properties);

            for(PropertyBase excluded : getExcludePropertyList())
            {
                index.setExcludeFromJSON(excluded, true);
                index.setExcludeFromMap(excluded, true);
            }
        }
        return index;
     }
}

Оригинальный ответ ниже:

Это происходит, если вы забыли добавить свойство к объекту индекса.В этом случае родительский объект является нулевым, и метаданные не могут быть установлены.

...