CompoundPropertyModel - преобразование логического значения перед рендерингом - PullRequest
3 голосов
/ 03 ноября 2011

Я использую CompoundPropertyModel (через PropertyListView) для печати свойств объекта (пользователя).

Одним из свойств объекта User является логическое значение.Я бы хотел, чтобы логическое значение отображалось с использованием пользовательского преобразования (false -> "disabled", true -> "enabled").

Как этого добиться, не добавляя новый метод в объект User?

add(new PropertyListView<User>("users", new LoadableUsersModel()) {
    @Override
    protected void populateItem(ListItem<User> item) {
        item.add(new Label("firstname"));
        item.add(new Label("surname"));
        item.add(new Label("username"));
        item.add(new Label("email"));
        item.add(new Label("active"));
    }
});

Ответы [ 3 ]

8 голосов
/ 03 ноября 2011

Есть несколько способов добиться этого:

  • Получите ваш объект модели от item и используйте if-else.

    User user = item.getModelObject();
    item.add(new Label("active", user.isActive() ? "enabled" : "disabled"));
  • Реализуйте IConverter и верните желаемое значение в методе convertToString(). Вернуть экземпляр преобразователя в переопределении метода getConverter() для Label. В этом примере это все анонимные классы, было бы лучше определить их как независимые классы, по крайней мере, конвертер, и иметь статический метод для использования только одного экземпляра.

    item.add(new Label("active"){
        public IConverter getConverter(Class type){
            return new IConverter(){
                public String convertToString(Object value, Locale locale){
                    if (Boolean.TRUE.equals(value) { return "enabled"; }
                    else if (Boolean.FALSE.equals(value) { return "disabled"; }
                    else { return null; }
                }
                public Object convertToObject(String value, Locale locale){
                    // Not needed, only used by FormComponents
                    return null;
                }
             }
        }
    };
  • Используйте AbstractReadOnlyModel для возврата желаемого значения, передавая его свойству active или модели с ним:

    PropertyModel pm = new PropertyModel(item.getModel(), "active");
    item.add(new Label("active", new AbstractReadOnlyModel(){
        public Object getObject() { 
            if (Boolean.TRUE.equals(pm.getObject()) { return "enabled"; }
            else if (Boolean.FALSE.equals(pm.getObject()) { return "disabled"; }
            else { return null; }
        }
    }));

В качестве примечания: если enabled и disabled являются литералами, которые должны отображаться на странице, вас может заинтересовать их локализация в файле ресурсов xml и использование getString() вместо этого.

5 голосов
/ 04 ноября 2011

В дополнение к методам, упомянутым Хави Лопесом, есть еще один, который может быть предпочтительнее, когда вы планируете локализовать свое приложение. Вы можете использовать StringresourceModel как

add(new Label("active", 
        new StringResourceModel("active.${active}", 
        new Model<String> item.getModel().getActive().toString())));

и определите resource.file (я бы предпочел XML), определив active.true = enabled и active.falsee = disabled.

1 голос
/ 03 ноября 2011

Вы можете использовать пользовательский конвертер . (См. здесь для другого примера (где-то посередине)). Но, похоже, что только в этом случае у вас будет меньше работы с простой конструкцией if / else.

...