невозможно получить список объектов с помощью Java Use API и Sightly (Htl)

#java #aem #sightly

#java #aem #sightly

Вопрос:

Я пытаюсь получить список пользовательских объектов типа linked list в html с помощью Sightly. Но я не могу прочитать их в sightly. Пример кода вставлен ниже:

Java Bean:

 public class MiniNavBean {

    private String fPath;

    private String activeAttr;

    public MiniNavBean(String fPath, String activeAttr){
        this.fPath = fPath;
        this.activeAttr = activeAttr;
    }

    public String getFpath() {
        return fPath;
    }

    public void setFpath(String fpath) {
        this.fPath = fpath;
    }

    public String getActiveattr() {
        return activeAttr;
    }

    public void setActiveattr(String activeattr) {
        this.activeAttr = activeattr;
    }

}
  

Класс Java, который расширяет WCMUsePojo:

 public class MiniNav extends WCMUsePojo {

    private List<MiniNavBean> navList;

    MiniNavBean miniNav;

    public List<MiniNavBean> getNavList() {
        return navList;
    }

    public void setNavList(List<MiniNavBean> navList) {
        this.navList = navList;
    }

    @Override
    public void activate() {
        navList = new LinkedList<MiniNavBean>();
        fPath = "fpaths";
        activeAttr = "activeattrs;"       
        miniNav = new MiniNavBean(fpath, activeattr);
        navList.add(miniNav);
    }
}
  

Html-файл (Sightly):

 <div data-sly-include="/apps/project/components/global.jsp"></div>
<div data-sly-use.mininav="com.components.MiniNav" data-sly-unwrap>
<div data-sly-list.navlist="${mininav.navList}">
   <li>
    <p>${navlist.fPath}</p>
    <p>${navlist.activeAttr}</p>
   </li>
</div>
  

Когда я пытаюсь выполнить приведенный выше код, я вижу, что связанный список создается вместе с данными в классе Java. Однако, когда я пытаюсь отобразить значения списка во внешнем интерфейсе, sightly не может его прочитать.

Поскольку LinkedList имеет тип CustomObject(MiniNavBean) Я подозреваю, что sightly не может его прочитать, поскольку он не знает об этом компоненте, потому что мы нигде не ссылались на этот компонент. Есть ли способ исправить это с помощью тегов sightly и прочитать данные?

Ответ №1:

Sightly также будет перебирать объекты Java. Я не думаю, что это проблема с Sightly. Похоже, ваши методы получения неверны. Измените свой компонент, как показано ниже

 public class MiniNavBean {

    private String fPath;

    private String activeAttr;

    public MiniNavBean(String fPath, String activeAttr){
        this.fPath = fPath;
        this.activeAttr = activeAttr;
    }

    public String getfPath() {
        return fPath;
    }

    public void setfPath(String fPath) {
        this.fPath = fPath;
    }

    public String getActiveAttr() {
        return activeAttr;
    }

    public void setActiveAttr(String activeAttr) {
        this.activeAttr = activeAttr;
    }
}
  

Если вы не хотите изменять компонент, вы можете получить доступ к получателям непосредственно в файле Sightly и проверить, работает ли он нормально.

 <div data-sly-include="/apps/project/components/global.jsp"></div>
<div data-sly-use.mininav="com.components.MiniNav" data-sly-unwrap>
<div data-sly-list.navlist="${mininav.navList}">
   <li>
    <p>${navlist.getFpath}</p>
    <p>${navlist.getActiveattr}</p>
   </li>
</div>
  

РЕДАКТИРОВАТЬ: чтобы объяснить больше на основе комментариев

Вы не можете получить доступ к полям, которые являются частными вне класса и обычно выполняются с использованием общедоступных методов получения. Однако в Sightly, когда вы используете имя поля после оператора dot, вы не обращаетесь к полю напрямую, вместо этого он вызывает соответствующий метод получения на основе спецификации Java для присвоения имен получателям / установщикам. Итак, согласно спецификации, ваши геттеры и сеттеры были ошибочными в компоненте, из-за чего он не работал.

Как я упоминал выше, вы можете изменить только свой компонент, и ваш код будет работать нормально. Или вы можете оставить свой компонент как есть и изменить код Sightly, чтобы все заработало.

Комментарии:

1. Большое спасибо. Теперь это сработало. Я ожидал, что он будет работать с самим именем переменной, не знал, что нам нужно вызвать средство получения в sightly. Чтобы сослаться на linkedlist в sightly, я не вызывал никакого средства получения, а просто вызывал объект navList напрямую. Но не знаю, зачем нам нужно вызывать getter для переменных в bean.

2. @RRN отредактировал ответ, чтобы объяснить, почему это работает именно так.

Ответ №2:

В вашем примере вы не присваиваете значение navList члену MiniNav и не добавляете к MiniNavBean нему экземпляр.

Добавьте следующие строки в свой activate() метод:

 this.navList = new LinkedList<>();
this.navList.add(navList);
  

Кроме того, средства получения Java и средства доступа HTL / Sightly не выровнены должным образом, т. Е.: для getFpath() вас следует использовать navlist.fpath

Если они у вас уже есть, получаете ли вы какие-либо ошибки компиляции или выполнения из HTL / Sightly?

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

Комментарии:

1. извините, это ошибка копирования вставки. У меня уже есть эти изменения в моем коде. Однако он не считывает значения пользовательского объекта, который хранится в связанном списке. Он может считывать значения, если связанный список имеет тип String, т.е. new LinkedList<String>()

2. Я не вижу никаких ошибок консоли или журналов ошибок в серверной части

3. @RRN li Элемент хотя бы отображается? Я только что заметил, что ваши геттеры / свойства неправильно выровнены друг с другом, т. Е.: для getFpath() вас следует использовать navlist.fpath