【问题标题】:unable to get the List of objects using Java Use API and Sightly(Htl)无法使用 Java 使用 API 和 Sightly(Htl) 获取对象列表
【发布时间】:2016-10-04 13:30:26
【问题描述】:

我正在尝试使用 Sightly 将链表类型的自定义对象列表转换为 html。但我无法将它们看在眼里。示例代码粘贴在下面:

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;
    }

}

扩展 WCMUsePojo 的 Java 类:

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 类中的数据实例化。但是,当我尝试在前端显示列表的值时,视觉上无法读取它。

由于 LinkedList 是 CustomObject 类型(MiniNavBean),我怀疑它无法读取它,因为它不知道这个 bean,因为我们没有在任何地方引用那个 bean。有没有办法使用清晰的标签来解决这个问题并读取数据?

【问题讨论】:

    标签: java aem sightly


    【解决方案1】:

    Sightly 也会遍历 Java 对象。我不认为这是 Sightly 的问题。看起来你的吸气剂是错误的。如下所示更改您的 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;
        }
    }
    

    如果您不想更改 bean,那么您可以直接在 Sightly 文件中访问 getter 并检查它是否工作正常。

    <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>
    

    编辑:根据 cmets 进行更多解释

    您不能访问在类之外的私有字段,通常使用公共 getter 方法完成。但是,在 Sightly 中,当您在点运算符之后使用字段名称时,您并没有直接访问该字段,而是根据 Java 规范调用相应的 getter 方法来命名 getter/setter。因此,根据规范,您的 getter 和 setter 在 bean 中是错误的,因此它不起作用。

    就像我上面提到的,你只能改变你的 bean,你的代码就可以正常工作。或者,您可以保留 bean 并更改 Sightly 代码以使其正常工作。

    【讨论】:

    • 非常感谢。它现在起作用了。我期待它可以与变量名本身一起使用,但不知道我们需要立即调用 getter。为了直观地引用链接列表,我没有调用任何 getter,而是直接调用了 navList 对象。但是不知道为什么我们需要为bean中的变量调用getter。
    • @RRN 编辑了答案以解释它为什么会这样工作。
    【解决方案2】:

    在您的示例中,您既没有为MiniNav 的navList 成员赋值,也没有向其中添加MiniNavBean 实例。

    将以下行添加到您的 activate() 方法中:

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

    此外,Java getter 和 HTL/Sightly 访问器未正确对齐,即:对于 getFpath(),您应该使用 navlist.fpath

    如果您已经有了这些,您是否从 HTL/Sightly 收到任何编译或运行时错误?

    HTL/Sightly 通常使用反射来查找对象的属性,因此它不太关心它们的类型。

    【讨论】:

    • 抱歉,这是一个复制粘贴错误。我的代码中已经有了这些更改。但是它不读取存储在链接列表中的自定义对象的值。如果链表是 String 类型,即 new LinkedList(),它能够读取值
    • 我在后端没有看到任何控制台错误或错误日志
    • @RRN li 元素至少被渲染了吗?我刚刚注意到您的 getter/properties 彼此没有正确对齐,即:对于getFpath(),您应该使用navlist.fpath
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-26
    • 1970-01-01
    • 2016-02-06
    • 2020-07-10
    相关资源
    最近更新 更多