#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